Merge remote-tracking branch 'upstream/master' into 120302_sb_swipe_lists_subtasks

pull/14/head
Sam Bosley 13 years ago
commit 760d7da160

@ -92,10 +92,10 @@
<!-- today -->
<string name="yesterday">Yesterday</string>
<!-- tomorrow abbreviated -->
<!-- tomorrow, abbreviated -->
<string name="tmrw">Tmrw</string>
<!-- today abbreviated -->
<!-- yesterday, abbreviated -->
<string name="yest">Yest</string>
<!-- ================================================== Generic Dialogs == -->

@ -737,14 +737,28 @@ public class AndroidUtilities {
}
}
/**
* Array of device names that should be considered tablets
*/
private static final String[] THREE_PANE_DEVICES = new String[] {
"kindle", //$NON-NLS-1$
};
/**
* Returns true if the screen is large or xtra large
* @param context
* @return
*/
public static boolean isTabletSized(Context context) {
int screenSize = context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
return (screenSize >= Configuration.SCREENLAYOUT_SIZE_LARGE);
int size = context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK;
if (size == Configuration.SCREENLAYOUT_SIZE_XLARGE) return true;
String model = android.os.Build.MODEL.toLowerCase();
for (String s : THREE_PANE_DEVICES) {
if (model.contains(s)) return true;
}
return false;
}
}

@ -29,6 +29,6 @@
<classpathentry exported="true" kind="lib" path="libs/google-oauth-client-1.6.0-beta.jar"/>
<classpathentry exported="true" kind="lib" path="libs/google-oauth-client-extensions-1.6.0-beta.jar"/>
<classpathentry exported="true" kind="lib" path="libs/gson-1.7.1.jar"/>
<classpathentry kind="lib" path="libs/crittercism_v2_0_1.jar"/>
<classpathentry kind="lib" path="libs/crittercism_v2_1_1.jar"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

@ -190,6 +190,25 @@
<move file="AndroidManifest_old.xml" tofile="AndroidManifest.xml" />
</target>
<target name="crittercism-permissions"
description="Apply extra crittercism permissions">
<if>
<condition>
<resourcecontains resource="AndroidManifest.xml" substring="READ_LOGS"/>
</condition>
<then>
<echo message="Nothing to do." />
</then>
<else>
<replace file="AndroidManifest.xml" token="android.permission.VIBRATE">
<replacevalue><![CDATA[android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.GET_TASKS]]></replacevalue>
</replace>
</else>
</if>
</target>
<target name="release-jenkins">
<property environment="env" />
<copy file="AndroidManifest.xml" tofile="AndroidManifest_old.xml" />

@ -287,7 +287,7 @@ public class TagUpdatesFragment extends ListFragment {
if(actFmPreferenceService.isLoggedIn()) {
item = menu.add(Menu.NONE, MENU_REFRESH_ID, Menu.NONE,
R.string.ENA_refresh_comments);
item.setIcon(R.drawable.ic_menu_refresh);
item.setIcon(R.drawable.icn_menu_refresh);
}
}

@ -54,6 +54,7 @@ import com.todoroo.astrid.helper.AsyncImageView;
import com.todoroo.astrid.helper.ProgressBarSyncResultCallback;
import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.tags.TagService.Tag;
@ -156,13 +157,12 @@ public class TagViewFragment extends TaskListFragment {
}
@Override
protected void addSyncRefreshMenuItem(Menu menu) {
protected void addSyncRefreshMenuItem(Menu menu, int themeFlags) {
if(actFmPreferenceService.isLoggedIn()) {
MenuItem item = menu.add(Menu.NONE, MENU_REFRESH_ID, Menu.NONE,
R.string.actfm_TVA_menu_refresh);
item.setIcon(R.drawable.ic_menu_refresh);
addMenuItem(menu, R.string.actfm_TVA_menu_refresh,
ThemeService.getDrawable(R.drawable.icn_menu_refresh, themeFlags), MENU_REFRESH_ID, false);
} else {
super.addSyncRefreshMenuItem(menu);
super.addSyncRefreshMenuItem(menu, themeFlags);
}
}

@ -28,6 +28,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import com.crittercism.app.Crittercism;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.DatabaseDao;
@ -327,12 +328,6 @@ public final class ActFmSyncService {
if(newlyCreated) {
if(task.getValue(Task.TITLE).length() == 0)
return;
for(int taskTitle : new int[] { R.string.intro_task_1_summary,
R.string.intro_task_2_summary, R.string.intro_task_3_summary }) {
String title = ContextManager.getString(taskTitle);
if(task.getValue(Task.TITLE).equals(title))
return;
}
if(TaskApiDao.insignificantChange(values))
return;
values = task.getMergedValues();
@ -433,15 +428,18 @@ public final class ActFmSyncService {
JsonHelper.taskFromJson(result, task, metadata);
} catch (JSONException e) {
handleException("task-save-json", e);
Crittercism.logHandledException(e);
} catch (IOException e) {
if (notPermanentError(e))
addFailedPush(new FailedPush(PUSH_TYPE_TASK, task.getId()));
else
Crittercism.logHandledException(e);
handleException("task-save-io", e);
task.setValue(Task.LAST_SYNC, DateUtilities.now() + 1000L);
}
task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskDao.saveExisting(task);
taskDao.saveExistingWithSqlConstraintCheck(task);
}
/**
@ -1096,8 +1094,10 @@ public final class ActFmSyncService {
handler.handleException("io-exception-list-" + model, e);
else
handleException("io-exception-list-" + model, e);
Crittercism.logHandledException(e);
} catch (JSONException e) {
handleException("json: " + result.toString(), e);
Crittercism.logHandledException(e);
}
}
}).start();

@ -11,6 +11,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.json.JSONException;
import com.crittercism.app.Crittercism;
import com.timsu.astrid.C2DMReceiver;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
@ -132,8 +133,10 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
Preferences.setInt(LAST_TAG_FETCH_TIME, time);
} catch (JSONException e) {
handler.handleException("actfm-sync", e); //$NON-NLS-1$
Crittercism.logHandledException(e);
} catch (IOException e) {
handler.handleException("actfm-sync", e); //$NON-NLS-1$
Crittercism.logHandledException(e);
} finally {
callback.incrementProgress(20);
if(finisher.decrementAndGet() == 0) {

@ -14,6 +14,7 @@ import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.activity.FilterListFragment;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.AstridFilterExposer;
@ -23,6 +24,7 @@ import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.tags.TagService;
/**
@ -66,7 +68,10 @@ public final class CoreFilterExposer extends BroadcastReceiver implements Astrid
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.filter_inbox)).getBitmap();
boolean isTablet = AndroidUtilities.isTabletSized(ContextManager.getContext());
int themeFlags = isTablet ? ThemeService.FLAG_FORCE_LIGHT : 0;
inbox.listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_inbox, themeFlags))).getBitmap();
return inbox;
}

@ -39,6 +39,7 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.taskrabbit.TaskRabbitMetadata;
/**
@ -74,6 +75,9 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
}
private Filter[] buildSavedFilters(Context context, Resources r) {
boolean isTablet = AndroidUtilities.isTabletSized(context);
int themeFlags = isTablet ? ThemeService.FLAG_FORCE_LIGHT : 0;
StoreObjectDao dao = PluginServices.getStoreObjectDao();
TodorooCursor<StoreObject> cursor = dao.query(Query.select(StoreObject.PROPERTIES).where(
StoreObject.TYPE.eq(SavedFilter.TYPE)).orderBy(Order.asc(SavedFilter.NAME)));
@ -91,7 +95,8 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
Task.DUE_DATE.gt(0),
Task.DUE_DATE.lte(PermaSql.VALUE_EOD))),
todayValues);
list[0].listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_calendar)).getBitmap();
list[0].listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_calendar, themeFlags))).getBitmap();
list[1] = new Filter(r.getString(R.string.BFE_Recent),
r.getString(R.string.BFE_Recent),
@ -99,7 +104,8 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
TaskCriteria.ownedByMe()).orderBy(
Order.desc(Task.MODIFICATION_DATE)).limit(15),
null);
list[1].listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_pencil)).getBitmap();
list[1].listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_pencil, themeFlags))).getBitmap();
list[2] = getAssignedByMeFilter(r);
@ -114,7 +120,8 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
deleteIntent.putExtra(TOKEN_FILTER_NAME, list[i].title);
list[i].contextMenuLabels = new String[] { context.getString(R.string.BFE_Saved_delete) };
list[i].contextMenuIntents = new Intent[] { deleteIntent };
list[i].listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_sliders)).getBitmap();
list[i].listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_sliders, themeFlags))).getBitmap();
}
return list;
@ -124,6 +131,8 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
}
public static Filter getAssignedByMeFilter(Resources r) {
boolean isTablet = AndroidUtilities.isTabletSized(ContextManager.getContext());
int themeFlags = isTablet ? ThemeService.FLAG_FORCE_LIGHT : 0;
Filter f = new Filter(r.getString(R.string.BFE_Assigned),
r.getString(R.string.BFE_Assigned),
new QueryTemplate().join(Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK)))
@ -132,7 +141,8 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
Criterion.or(Task.USER_ID.neq(0),
Criterion.and(Metadata.KEY.eq(TaskRabbitMetadata.METADATA_KEY), TaskRabbitMetadata.ID.gt(0))))),
null);
f.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_assigned)).getBitmap();
f.listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.filter_assigned, themeFlags))).getBitmap();
return f;
}

@ -14,7 +14,7 @@ public class GtasksBackgroundService extends SyncV2BackgroundService {
@Override
protected SyncV2Provider getSyncProvider() {
return new GtasksSyncV2Provider();
return GtasksSyncV2Provider.getInstance();
}
@Override

@ -16,8 +16,8 @@ import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.subtasks.OrderedListFragmentHelper;
import com.todoroo.astrid.subtasks.SubtasksListFragment;
@ -35,8 +35,6 @@ public class GtasksListFragment extends SubtasksListFragment {
@Autowired private GtasksMetadataService gtasksMetadataService;
@Autowired private GtasksSyncService gtasksSyncService;
@Autowired private GtasksPreferenceService gtasksPreferenceService;
@Autowired private SyncV2Service syncService;
@ -54,13 +52,7 @@ public class GtasksListFragment extends SubtasksListFragment {
@Override
protected OrderedListFragmentHelper<?> createFragmentHelper() {
return new OrderedListFragmentHelper<StoreObject>(this, gtasksTaskListUpdater) {
@Override
protected void onMetadataChanged(long targetTaskId) {
gtasksSyncService.triggerMoveForMetadata(gtasksMetadataService.
getTaskMetadata(targetTaskId));
}
};
return new OrderedListFragmentHelper<StoreObject>(this, gtasksTaskListUpdater);
}
@Override
@ -94,9 +86,7 @@ public class GtasksListFragment extends SubtasksListFragment {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
MenuItem item = menu.add(Menu.NONE, MENU_CLEAR_COMPLETED_ID, Menu.FIRST,
this.getString(R.string.gtasks_GTA_clear_completed));
item.setIcon(android.R.drawable.ic_input_delete); // Needs new icon
addMenuItem(menu, R.string.gtasks_GTA_clear_completed, android.R.drawable.ic_input_delete, MENU_CLEAR_COMPLETED_ID, false);
}
@Override
@ -157,13 +147,12 @@ public class GtasksListFragment extends SubtasksListFragment {
}
@Override
protected void addSyncRefreshMenuItem(Menu menu) {
protected void addSyncRefreshMenuItem(Menu menu, int themeFlags) {
if(gtasksPreferenceService.isLoggedIn()) {
MenuItem item = menu.add(Menu.NONE, MENU_REFRESH_ID, Menu.NONE,
R.string.actfm_TVA_menu_refresh);
item.setIcon(R.drawable.ic_menu_refresh);
addMenuItem(menu, R.string.actfm_TVA_menu_refresh,
ThemeService.getDrawable(R.drawable.icn_menu_refresh, themeFlags), MENU_REFRESH_ID, false);
} else {
super.addSyncRefreshMenuItem(menu);
super.addSyncRefreshMenuItem(menu, themeFlags);
}
}

@ -76,6 +76,11 @@ public class GtasksListService {
}
}
/**
* Reads in remote list information and updates local list objects.
*
* @param remoteLists remote information about your lists
*/
@SuppressWarnings("nls")
public synchronized void updateLists(TaskLists remoteLists) {
readLists();

@ -50,7 +50,7 @@ public class GtasksPreferences extends SyncProviderPreferences {
@Override
public void logOut() {
new GtasksSyncV2Provider().signOut();
GtasksSyncV2Provider.getInstance().signOut();
}
@Override

@ -12,6 +12,7 @@ import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
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.astrid.api.Filter;
@ -20,6 +21,7 @@ import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.subtasks.OrderedListUpdater;
public class GtasksTaskListUpdater extends OrderedListUpdater<StoreObject> {
@ -35,6 +37,7 @@ public class GtasksTaskListUpdater extends OrderedListUpdater<StoreObject> {
@Autowired private GtasksListService gtasksListService;
@Autowired private GtasksMetadataService gtasksMetadataService;
@Autowired private GtasksSyncService gtasksSyncService;
@Autowired private MetadataDao metadataDao;
public GtasksTaskListUpdater() {
@ -79,6 +82,11 @@ public class GtasksTaskListUpdater extends OrderedListUpdater<StoreObject> {
gtasksMetadataService.iterateThroughList(list, iterator);
}
@Override
protected void onMovedOrIndented(Metadata metadata) {
gtasksSyncService.triggerMoveForMetadata(metadata);
}
// --- used during synchronization
/**
@ -132,7 +140,7 @@ public class GtasksTaskListUpdater extends OrderedListUpdater<StoreObject> {
TodorooCursor<Metadata> metadata = metadataDao.query(Query.select(Metadata.PROPERTIES)
.where(Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY),
GtasksMetadata.LIST_ID.eq(listId), GtasksMetadata.PARENT_TASK.eq(parent)))
.orderBy(Order.asc(GtasksMetadata.GTASKS_ORDER)));
.orderBy(Order.asc(Functions.cast(GtasksMetadata.GTASKS_ORDER, "INTEGER")))); //$NON-NLS-1$
try {
if (metadata.getCount() > 0) {
Metadata curr = new Metadata();

@ -5,7 +5,9 @@ import java.util.concurrent.LinkedBlockingQueue;
import android.content.ContentValues;
import android.text.TextUtils;
import android.util.Log;
import com.crittercism.app.Crittercism;
import com.todoroo.andlib.data.DatabaseDao.ModelUpdateListener;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.service.Autowired;
@ -21,7 +23,6 @@ import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksMetadata;
import com.todoroo.astrid.gtasks.GtasksMetadataService;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.GtasksTaskListUpdater;
import com.todoroo.astrid.gtasks.api.CreateRequest;
import com.todoroo.astrid.gtasks.api.GtasksApiUtilities;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
@ -36,7 +37,6 @@ public final class GtasksSyncService {
@Autowired GtasksMetadataService gtasksMetadataService;
@Autowired TaskDao taskDao;
@Autowired GtasksPreferenceService gtasksPreferenceService;
@Autowired GtasksTaskListUpdater gtasksTaskListUpdater;
public GtasksSyncService() {
DependencyInjectionService.getInstance().inject(this);
@ -48,6 +48,7 @@ public final class GtasksSyncService {
private class TaskPushOp extends SyncOnSaveOperation {
protected Task model;
protected long creationDate = DateUtilities.now();
public TaskPushOp(Task model) {
this.model = model;
@ -63,9 +64,10 @@ public final class GtasksSyncService {
}
@SuppressWarnings("nls")
public void initialize() {
new Thread(new Runnable() {
public void run() {
public void run() {
while (true) {
SyncOnSaveOperation op;
try {
@ -78,14 +80,17 @@ public final class GtasksSyncService {
GtasksInvoker invoker = new GtasksInvoker(gtasksPreferenceService.getToken());
if (op instanceof TaskPushOp) {
TaskPushOp taskPush = (TaskPushOp)op;
pushTaskOnSave(taskPush.model, taskPush.model.getMergedValues(), invoker, true);
if(DateUtilities.now() - taskPush.creationDate < 1000)
AndroidUtilities.sleepDeep(1000 - (DateUtilities.now() - taskPush.creationDate));
pushTaskOnSave(taskPush.model, taskPush.model.getMergedValues(), invoker, false);
} else if (op instanceof MoveOp) {
MoveOp move = (MoveOp)op;
pushMetadataOnSave(move.metadata, invoker);
}
}
} catch (IOException e){
System.err.println("Sync on save failed"); //$NON-NLS-1$
} catch (IOException e) {
Crittercism.logHandledException(e);
Log.w("gtasks-sync-error", "Sync on save failed", e);
}
}
}
@ -103,17 +108,14 @@ public final class GtasksSyncService {
if (!checkValuesForProperties(setValues, TASK_PROPERTIES)) //None of the properties we sync were updated
return;
operationQueue.offer(new TaskPushOp((Task)model.clone()));
Task toPush = taskDao.fetch(model.getId(), TASK_PROPERTIES);
operationQueue.offer(new TaskPushOp(toPush));
}
});
}
private static final Property<?>[] TASK_PROPERTIES =
{ Task.TITLE,
Task.NOTES,
Task.DUE_DATE,
Task.COMPLETION_DATE,
Task.DELETION_DATE };
private static final Property<?>[] TASK_PROPERTIES = { Task.ID, Task.TITLE,
Task.NOTES, Task.DUE_DATE, Task.COMPLETION_DATE, Task.DELETION_DATE };
/**
* Checks to see if any of the values changed are among the properties we sync
@ -123,7 +125,7 @@ public final class GtasksSyncService {
*/
private boolean checkValuesForProperties(ContentValues values, Property<?>[] properties) {
for (Property<?> property : properties) {
if (values.containsKey(property.name))
if (property != Task.ID && values.containsKey(property.name))
return true;
}
return false;
@ -131,6 +133,8 @@ public final class GtasksSyncService {
public void triggerMoveForMetadata(final Metadata metadata) {
if (metadata == null)
return;
if (metadata.checkAndClearTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC))
return;
if (!metadata.getValue(Metadata.KEY).equals(GtasksMetadata.METADATA_KEY)) //Don't care about non-gtasks metadata
@ -180,7 +184,8 @@ public final class GtasksSyncService {
} else { //update case
remoteId = gtasksMetadata.getValue(GtasksMetadata.ID);
listId = gtasksMetadata.getValue(GtasksMetadata.LIST_ID);
remoteModel = invoker.getGtask(listId, remoteId);
remoteModel = new com.google.api.services.tasks.model.Task();
remoteModel.setId(remoteId);
}
//If task was newly created but without a title, don't sync--we're in the middle of
@ -234,7 +239,7 @@ public final class GtasksSyncService {
gtasksMetadata.setValue(GtasksMetadata.LAST_SYNC, DateUtilities.now() + 1000L);
metadataService.save(gtasksMetadata);
task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
taskDao.saveExisting(task);
taskDao.saveExistingWithSqlConstraintCheck(task);
}
public void pushMetadataOnSave(Metadata model, GtasksInvoker invoker) throws IOException {

@ -3,6 +3,7 @@ package com.todoroo.astrid.gtasks.sync;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@ -10,6 +11,7 @@ import org.json.JSONException;
import android.text.TextUtils;
import com.crittercism.app.Crittercism;
import com.google.api.services.tasks.model.Tasks;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.AbstractModel;
@ -40,6 +42,7 @@ import com.todoroo.astrid.gtasks.api.GtasksApiUtilities;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TaskService;
@ -49,6 +52,7 @@ import com.todoroo.astrid.sync.SyncV2Provider;
public class GtasksSyncV2Provider extends SyncV2Provider {
@Autowired TaskService taskService;
@Autowired MetadataService metadataService;
@Autowired StoreObjectDao storeObjectDao;
@Autowired GtasksPreferenceService gtasksPreferenceService;
@Autowired GtasksSyncService gtasksSyncService;
@ -60,6 +64,18 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
AstridDependencyInjector.initialize();
}
private static GtasksSyncV2Provider instance = null;
protected GtasksSyncV2Provider() {
// prevent multiple sync providers
}
public synchronized static GtasksSyncV2Provider getInstance() {
if(instance == null)
instance = new GtasksSyncV2Provider();
return instance;
}
@Override
public String getName() {
return ContextManager.getString(R.string.gtasks_GPr_header);
@ -84,8 +100,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
}
@Override
public void synchronizeActiveTasks(boolean manual, final SyncResultCallback callback) {
public void synchronizeActiveTasks(final boolean manual, final SyncResultCallback callback) {
callback.started();
callback.incrementMax(100);
@ -98,10 +113,11 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
gtasksListService.updateLists(invoker.allGtaskLists());
} catch (IOException e) {
handler.handleException("gtasks-sync=io", e); //$NON-NLS-1$
} finally {
callback.incrementMax(25);
Crittercism.logHandledException(e);
}
StoreObject[] lists = gtasksListService.getLists();
callback.incrementMax(25 * lists.length);
final AtomicInteger finisher = new AtomicInteger(lists.length);
pushUpdated(invoker, callback);
@ -110,7 +126,8 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
new Thread(new Runnable() {
@Override
public void run() {
synchronizeListHelper(list, invoker, handler, callback);
synchronizeListHelper(list, invoker, manual, handler, callback);
callback.incrementProgress(25);
if (finisher.decrementAndGet() == 0) {
gtasksPreferenceService.recordSuccessfulSync();
callback.finished();
@ -122,8 +139,9 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
}).start();
}
private void pushUpdated(GtasksInvoker invoker, SyncResultCallback callback) {
TodorooCursor<Task> queued = taskService.query(Query.select(Task.PROPERTIES).join(Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(
private synchronized void pushUpdated(GtasksInvoker invoker, SyncResultCallback callback) {
TodorooCursor<Task> queued = taskService.query(Query.select(Task.PROPERTIES).
join(Join.left(Metadata.TABLE, Task.ID.eq(Metadata.TASK))).where(
Criterion.or(
Criterion.and(MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY),
Task.MODIFICATION_DATE.gt(GtasksMetadata.LAST_SYNC)),
@ -137,19 +155,19 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
gtasksSyncService.pushTaskOnSave(task, task.getMergedValues(), invoker, false);
} catch (IOException e) {
handler.handleException("gtasks-sync-io", e); //$NON-NLS-1$
Crittercism.logHandledException(e);
} finally {
callback.incrementProgress(10);
}
}
}
finally {
} finally {
queued.close();
}
}
@Override
public void synchronizeList(Object list, boolean manual, final SyncResultCallback callback) {
public void synchronizeList(Object list, final boolean manual, final SyncResultCallback callback) {
if (!(list instanceof StoreObject))
return;
final StoreObject gtasksList = (StoreObject) list;
@ -166,7 +184,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
String authToken = getValidatedAuthToken();
callback.incrementProgress(25);
final GtasksInvoker service = new GtasksInvoker(authToken);
synchronizeListHelper(gtasksList, service, null, callback);
synchronizeListHelper(gtasksList, service, manual, null, callback);
} finally {
callback.incrementProgress(25);
callback.finished();
@ -188,34 +206,50 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
}
private void synchronizeListHelper(StoreObject list, GtasksInvoker invoker,
SyncExceptionHandler errorHandler, SyncResultCallback callback) {
// Do stuff
private synchronized void synchronizeListHelper(StoreObject list, GtasksInvoker invoker,
boolean manual, SyncExceptionHandler errorHandler, SyncResultCallback callback) {
String listId = list.getValue(GtasksList.REMOTE_ID);
long lastSyncDate;
if (list.containsNonNullValue(GtasksList.LAST_SYNC)) {
if (!manual && list.containsNonNullValue(GtasksList.LAST_SYNC)) {
lastSyncDate = list.getValue(GtasksList.LAST_SYNC);
} else {
lastSyncDate = 0;
}
boolean includeDeletedAndHidden = lastSyncDate != 0;
try {
Tasks taskList = invoker.getAllGtasksFromListId(listId, includeDeletedAndHidden, includeDeletedAndHidden, lastSyncDate);
Tasks taskList = invoker.getAllGtasksFromListId(listId, includeDeletedAndHidden,
includeDeletedAndHidden, lastSyncDate);
List<com.google.api.services.tasks.model.Task> tasks = taskList.getItems();
if (tasks != null) {
callback.incrementMax(tasks.size() * 10);
HashSet<Long> localIds = new HashSet<Long>(tasks.size());
for (com.google.api.services.tasks.model.Task t : tasks) {
GtasksTaskContainer container = parseRemoteTask(t, listId);
gtasksMetadataService.findLocalMatch(container);
container.gtaskMetadata.setValue(GtasksMetadata.GTASKS_ORDER, Long.parseLong(t.getPosition()));
container.gtaskMetadata.setValue(GtasksMetadata.PARENT_TASK, gtasksMetadataService.localIdForGtasksId(t.getParent()));
container.gtaskMetadata.setValue(GtasksMetadata.LAST_SYNC, DateUtilities.now() + 1000L);
container.gtaskMetadata.setValue(GtasksMetadata.GTASKS_ORDER,
Long.parseLong(t.getPosition()));
container.gtaskMetadata.setValue(GtasksMetadata.PARENT_TASK,
gtasksMetadataService.localIdForGtasksId(t.getParent()));
container.gtaskMetadata.setValue(GtasksMetadata.LAST_SYNC,
DateUtilities.now() + 1000L);
write(container);
localIds.add(container.task.getId());
callback.incrementProgress(10);
}
list.setValue(GtasksList.LAST_SYNC, DateUtilities.now());
storeObjectDao.persist(list);
if(lastSyncDate == 0) {
Long[] localIdArray = localIds.toArray(new Long[localIds.size()]);
Criterion delete = Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY),
GtasksMetadata.LIST_ID.eq(listId),
Criterion.not(Metadata.TASK.in(localIdArray)));
taskService.deleteWhere(
Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).
where(delete)));
metadataService.deleteWhere(delete);
}
gtasksTaskListUpdater.correctOrderAndIndentForList(listId);
}
} catch (IOException e) {

@ -25,6 +25,7 @@ import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.ThemeService;
import com.twofortyfouram.SharedResources;
/**
@ -99,6 +100,7 @@ public final class LocaleEditAlerts extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
ThemeService.forceTheme(R.style.Theme_White);
super.onCreate(savedInstanceState);
setContentView(R.layout.locale_edit_alerts);

@ -142,7 +142,6 @@ public class OrderedListFragmentHelper<LIST> {
}
fragment.loadTaskListContent(true);
onMetadataChanged(targetTaskId);
}
};
@ -166,7 +165,6 @@ public class OrderedListFragmentHelper<LIST> {
Log.e("drag", "Indent Error", e); //$NON-NLS-1$ //$NON-NLS-2$
}
fragment.loadTaskListContent(true);
onMetadataChanged(targetTaskId);
}
};
@ -204,13 +202,6 @@ public class OrderedListFragmentHelper<LIST> {
return taskAdapter;
}
/**
* @param targetTaskId
*/
protected void onMetadataChanged(long targetTaskId) {
// hook
}
private final class DraggableTaskAdapter extends TaskAdapter {
private DraggableTaskAdapter(TaskListFragment activity, int resource,

@ -9,7 +9,6 @@ import java.util.concurrent.atomic.AtomicReference;
import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.data.Metadata;
@ -54,6 +53,13 @@ abstract public class OrderedListUpdater<LIST> {
//
}
/**
* @param metadata
*/
protected void onMovedOrIndented(Metadata metadata) {
//
}
/**
* @param list
* @param taskId
@ -106,7 +112,7 @@ abstract public class OrderedListUpdater<LIST> {
else
metadata.setValue(parentProperty(), newParent);
}
saveAndUpdateModifiedDate(metadata, taskId);
saveAndUpdateModifiedDate(metadata);
}
} else if(targetTaskIndent.get() > -1) {
// found first task that is not beneath target
@ -114,7 +120,7 @@ abstract public class OrderedListUpdater<LIST> {
targetTaskIndent.set(-1);
else {
metadata.setValue(indentProperty(), indent + delta);
saveAndUpdateModifiedDate(metadata, taskId);
saveAndUpdateModifiedDate(metadata);
}
} else {
previousIndent.set(indent);
@ -122,10 +128,11 @@ abstract public class OrderedListUpdater<LIST> {
}
if(!metadata.isSaved())
saveAndUpdateModifiedDate(metadata, taskId);
saveAndUpdateModifiedDate(metadata);
}
});
onMovedOrIndented(getTaskMetadata(list, targetTaskId));
}
/**
@ -198,6 +205,7 @@ abstract public class OrderedListUpdater<LIST> {
}
traverseTreeAndWriteValues(list, root, new AtomicLong(0), -1);
onMovedOrIndented(getTaskMetadata(list, targetTaskId));
}
private boolean ancestorOf(Node ancestor, Node descendant) {
@ -226,9 +234,15 @@ abstract public class OrderedListUpdater<LIST> {
metadata = createEmptyMetadata(list, node.taskId);
metadata.setValue(orderProperty(), order.getAndIncrement());
metadata.setValue(indentProperty(), indent);
if(parentProperty() != null)
boolean parentChanged = false;
if(parentProperty() != null && metadata.getValue(parentProperty()) !=
node.parent.taskId) {
parentChanged = true;
metadata.setValue(parentProperty(), node.parent.taskId);
saveAndUpdateModifiedDate(metadata, node.taskId);
}
saveAndUpdateModifiedDate(metadata);
if(parentChanged)
onMovedOrIndented(metadata);
}
for(Node child : node.children) {
@ -285,16 +299,10 @@ abstract public class OrderedListUpdater<LIST> {
return root;
}
protected final Task taskContainer = new Task();
protected void saveAndUpdateModifiedDate(Metadata metadata, long taskId) {
protected void saveAndUpdateModifiedDate(Metadata metadata) {
if(metadata.getSetValues().size() == 0)
return;
PluginServices.getMetadataService().save(metadata);
taskContainer.setId(taskId);
taskContainer.setValue(Task.MODIFICATION_DATE, DateUtilities.now());
taskContainer.setValue(Task.DETAILS_DATE, DateUtilities.now());
PluginServices.getTaskService().save(taskContainer);
}
// --- task cascading operations
@ -339,8 +347,10 @@ abstract public class OrderedListUpdater<LIST> {
if(target != null && target.parent != null) {
int targetIndex = target.parent.children.indexOf(target);
target.parent.children.remove(targetIndex);
for(Node node : target.children)
for(Node node : target.children) {
node.parent = target.parent;
target.parent.children.add(targetIndex++, node);
}
}
traverseTreeAndWriteValues(list, root, new AtomicLong(0), -1);

@ -139,7 +139,7 @@ public class SubtasksUpdater extends OrderedListUpdater<String> {
metadata.setValue(SubtasksMetadata.ORDER, order);
metadata.setValue(SubtasksMetadata.INDENT, indent);
saveAndUpdateModifiedDate(metadata, taskId);
saveAndUpdateModifiedDate(metadata);
previousIndent.set(indent);
previousOrder.set(order);

@ -26,6 +26,7 @@ import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.actfm.TagViewFragment;
@ -44,6 +45,7 @@ import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.ThemeService;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import com.todoroo.astrid.tags.TagService.Tag;
import com.todoroo.astrid.utility.AstridPreferences;
@ -166,6 +168,9 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
Context context = ContextManager.getContext();
Resources r = context.getResources();
boolean isTablet = AndroidUtilities.isTabletSized(context);
int themeFlags = isTablet ? ThemeService.FLAG_FORCE_LIGHT : 0;
// --- untagged
int untaggedLabel = gtasksPreferenceService.isLoggedIn() ?
R.string.tag_FEx_untagged_w_astrid : R.string.tag_FEx_untagged;
@ -173,7 +178,8 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
r.getString(R.string.tag_FEx_untagged),
TagService.untaggedTemplate(),
null);
untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.gl_lists)).getBitmap();
untagged.listingIcon = ((BitmapDrawable)r.getDrawable(
ThemeService.getDrawable(R.drawable.gl_lists, themeFlags))).getBitmap();
filters[0] = untagged;
for(int i = 0; i < tags.length; i++)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 984 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 914 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 950 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 887 B

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ScrollView
android:layout_width="280dip"
android:layout_height="220dip"
android:layout_below="@+id/gdi_arrow_up"
android:background="?attr/asListPopoverBg">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/topFixedItems"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
<include layout="@layout/fla_separator"/>
<LinearLayout
android:id="@+id/content"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
<include layout="@layout/fla_separator"/>
<LinearLayout
android:id="@+id/bottomFixedItems"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
</LinearLayout>
</ScrollView>
</merge>

@ -49,6 +49,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingBottom="10dip"
android:textColor="@android:color/black"
android:entries="@array/locale_interval" />
</LinearLayout>

@ -1,33 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
<com.todoroo.astrid.ui.TouchInterceptingFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dip">
<LinearLayout
android:id="@+id/content"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="?attr/asListPopoverBg"
android:orientation="vertical"
android:layout_below="@+id/gdi_arrow_up"/>
<ImageView
android:id="@+id/gdi_arrow_up"
android:layout_width="27dip"
android:layout_height="27dip"
android:layout_marginLeft="-10dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:src="?attr/asListArrowUp" />
<ImageView
android:id="@+id/gdi_arrow_down"
android:layout_width="27dip"
android:layout_height="27dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:layout_below="@android:id/list"/>
</RelativeLayout>
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dip">
<include layout="@layout/main_menu_popover_body"/>
<ImageView
android:id="@+id/gdi_arrow_up"
android:layout_width="27dip"
android:layout_height="27dip"
android:layout_marginLeft="-10dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:src="?attr/asListArrowUp" />
<ImageView
android:id="@+id/gdi_arrow_down"
android:layout_width="27dip"
android:layout_height="27dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:layout_below="@android:id/list"/>
</RelativeLayout>
</com.todoroo.astrid.ui.TouchInterceptingFrameLayout>

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ScrollView
android:layout_width="280dip"
android:layout_height="380dip"
android:layout_below="@+id/gdi_arrow_up"
android:background="?attr/asListPopoverBg">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/topFixedItems"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
<include layout="@layout/fla_separator"/>
<LinearLayout
android:id="@+id/content"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
<include layout="@layout/fla_separator"/>
<LinearLayout
android:id="@+id/bottomFixedItems"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
</LinearLayout>
</ScrollView>
</merge>

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ScrollView
android:layout_width="280dip"
android:layout_height="wrap_content"
android:layout_below="@+id/gdi_arrow_up"
android:background="@drawable/list_popover_bg_white">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/topFixedItems"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
<include layout="@layout/fla_separator"/>
<LinearLayout
android:id="@+id/content"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
<include layout="@layout/fla_separator"/>
<LinearLayout
android:id="@+id/bottomFixedItems"
android:layout_width="280dip"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:orientation="vertical"/>
</LinearLayout>
</ScrollView>
</merge>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<com.todoroo.astrid.ui.TouchInterceptingFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dip">
<include layout="@layout/main_menu_popover_body_tablet"/>
<ImageView
android:id="@+id/gdi_arrow_up"
android:layout_width="27dip"
android:layout_height="27dip"
android:layout_marginLeft="-10dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:src="@drawable/list_arrow_up_white" />
<ImageView
android:id="@+id/gdi_arrow_down"
android:layout_width="27dip"
android:layout_height="27dip"
android:scaleType="fitCenter"
android:layout_marginBottom="-8dip"
android:layout_below="@android:id/list"/>
</RelativeLayout>
</com.todoroo.astrid.ui.TouchInterceptingFrameLayout>

@ -2,8 +2,8 @@
<!-- See the file "LICENSE" for the full license governing this code. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="60dip"
android:minHeight="60dip"
android:layout_height="44dip"
android:minHeight="44dip"
android:background="@android:drawable/list_selector_background"
android:paddingTop="5dip"
android:paddingBottom="5dip"

@ -0,0 +1,34 @@
<?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:layout_width="fill_parent"
android:layout_height="44dip"
android:minHeight="44dip"
android:background="@android:drawable/list_selector_background"
android:paddingTop="5dip"
android:paddingBottom="5dip"
android:paddingRight="6dip"
android:gravity="center_vertical"
android:orientation="horizontal">
<!-- filter icon -->
<ImageView android:id="@+id/icon"
android:layout_width="36dip"
android:layout_height="36dip"
android:layout_alignParentLeft="true"
android:layout_marginLeft="12dip"
android:scaleType="fitCenter"/>
<!-- filter name -->
<TextView android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="12dp"
android:paddingRight="30dp"
android:checked="false"
android:gravity="center_vertical"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#000000"/>
</LinearLayout>

@ -70,6 +70,7 @@
android:layout_marginLeft="5dip"
android:layout_marginBottom="3dip"
android:paddingRight="30dp"
android:ellipsize="start"
android:singleLine="true"
android:textSize="12sp"
android:text="2 New &amp; Used from $224"

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Press me to see notes</string>
<string name="intro_task_1_summary">Create your first task</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Add a widget to your desktop</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Úvod: Stiskni mne pro zobrazení poznámek</string>
<string name="intro_task_1_summary">Vytvoř svůj první úkol</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Vložte widget na vaši plochu</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Tryk her for at se noter</string>
<string name="intro_task_1_summary">Opret din første opgave</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Tilføj widget på startskærm</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Einführung: Drücken Sie hier, um die Hinweise anzuzeigen</string>
<string name="intro_task_1_summary">Erstelle deine erste Aufgabe</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Widget zum Desktop hinzufügen</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Synchronisation mit Astrid.com einrichten</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Beginnen Sie, indem Sie ein oder zwei Aufgaben hinzufügen</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Press me to see notes</string>
<string name="intro_task_1_summary">Crea su primera tarea</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Añadir un widget a su escritorio</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro : appuyez pour voir les notes</string>
<string name="intro_task_1_summary">Créer votre première tâche</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Ajouter un widget sur votre bureau</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Configurer la synchronisation avec Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Press me to see notes</string>
<string name="intro_task_1_summary">Create your first task</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Add a widget to your desktop</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Press me to see notes</string>
<string name="intro_task_1_summary">Crea la tua prima attività</string>
<string name="intro_task_1_note">Due modi per aggiungere un\'attività:\n 1) Aggiunta Rapida: scrivi il titolo dell\'attività nel campo in basso e premi il pulsante + che appare a sinistra.\n\n 2) Aggiunta normale: premi il pulsante sulla destra del campo in basso. Aggiungi le informazioni base (data di terminazione, etichette, note) o imposta opzioni più avanzate. Salva l\'attività con il pulsante di salvataggio o il pulsante indietro sul tuo telefono.\n\n</string>
<string name="intro_task_2_summary">Aggiungi un widget sul tuo desktop</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Press me to see notes</string>
<string name="intro_task_1_summary">Create your first task</string>
<string name="intro_task_1_note">タスクを登録する2つの方法\n 1) 素早い登録: 入力欄にタスク名を入力し、入力欄の左に表示される + ボタンを押します。\n\n2) 標準の登録: 入力欄の右側にあるボタンを押します。期限やタグ、メモやより高度な設定を行えます。保存ボタンか電話機のバックボタンで保存します。\n\n</string>
<string name="intro_task_2_summary">ホーム画面にウィジェットを追加する</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>
@ -1000,15 +993,19 @@
<item>Gosh, you are looking suave today!</item>
<item>Do something great today!</item>
<item>Make me proud today!</item>
<item>How are you doing today?</item>
</string-array>
<string-array name="PPW_encouragements_tod">
<item>Good afternoon!</item>
<item>Good evening!</item>
<item>Late night?</item>
<item>Afternoon tea, perhaps?</item>
<item>Enjoy the evening!</item>
<item>Sleep is good for you, you know!</item>
</string-array>
<!-- encouragements based on time of day -->
<item>Good morning!</item>
<item>Good afternoon!</item>
<item>Good evening!</item>
<item>Late night?</item>
<item>It\'s early, get something done!</item>
<item>Afternoon tea, perhaps?</item>
<item>Enjoy the evening!</item>
<item>Sleep is good for you, you know!</item>
</string-array>
<string-array name="PPW_encouragements_completed">
<item>You\'ve already completed %d tasks!</item>
<item>Score in life: %d tasks completed</item>
@ -1016,9 +1013,10 @@
</string-array>
<string name="PPW_encouragements_none_completed">You haven\'t completed any tasks yet! Shall we?</string>
<string-array name="PPW_colors">
<item>Black</item>
<item>Blue</item>
<item>Translucent</item>
<item>Black</item>
<item>White</item>
<item>Blue</item>
<item>Translucent</item>
</string-array>
<string name="PPW_widget_dlg_text">This widget is only available to owners of the PowerPack!</string>
<string name="PPW_widget_dlg_ok">Preview</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Press me to see notes</string>
<string name="intro_task_1_summary">Create your first task</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">바탕화면에 위젯 추가</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Trykk på meg for å se notater.</string>
<string name="intro_task_1_summary">Skap din første oppgave</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Legg til en widget på skrivebordet</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Druk hier om notities weer te geven</string>
<string name="intro_task_1_summary">Eerste taak aanmaken</string>
<string name="intro_task_1_note">Twee manieren om een taak te maken:\n 1) Snel toevoegen: Beschrijf de taak in het veld onderin en druk op de + knop aan de linker kant.\n\n 2) Normaal toevoegen: Druk op de knop aan de rechter kant van het veld onderin. Vul de standaard details in (einddatum, labels, notities) of gebruik de geavanceerde opties. Bewaar de taak met de bewaarknop of gebruik de \'Terug\' toets op het toestel.\n\n</string>
<string name="intro_task_2_summary">Widget toevoegen aan het hoofdscherm</string>
<string name="intro_task_2_note">Een bureaublad widget is een geweldige manier om de te doen taken bij te houden en een manier om snel nieuwe taken toe te voegen.\n\n Hoe een widget toevoegen?:\n 1) Druk lang op het bureaublad.\n 2) Kies \"Widget\" uit het menu\n 3) Selecteer de Astrid widget.\n 4) Selecteer een Astrid filter. Selecteer \"Actieve taken\" voor alle taken\n\n Bonus: Gebruik de widget om een taak toe te voegen!</string>
<string name="intro_task_3_summary">Instellingen synchroniseren met Astrid.com</string>
<string name="intro_task_3_note">Astrid maakt het mogelijk de taken te synchroniseren met Astrid.com, Google Taken en Producteev.\n\n Om synchroniseren vanuit Astrid in te schakelen, druk \"Menu\"-&gt; \"Instellingen\" -&gt; \"Synchronisatie\" en selecteer de gewenste provider.</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Nie znaleziono konta %s --proszę wyloguj się i zaloguj ponownie w ustawieniach Google Zadań.</string>
<string name="gtasks_error_authRefresh">Uwierzytelnienie w Google Zadania nieudane. Proszę, sprawdź poprawność swego hasła lub spróbuj ponownie później.</string>
<string name="gtasks_error_accountManager">Błąd w menadżerze kont Twojego telefonu. Proszę, wyloguj się i zaloguj ponownie w ustawieniach Google Zadań.</string>
<string name="intro_click_prompt">Wstęp: Kliknij mnie by zoabczyć notatkę</string>
<string name="intro_task_1_summary">Utwórz swoje pierwsze zadanie</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Dodaj widget na pulpit</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Ustaw synch z Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Dodaj zadanie tutaj</string>
<string name="help_popover_tap_task">Puknij zadanie by je edytować i udostępnić</string>
<string name="help_popover_list_settings">Puknij ustawienia listy by udostępnić całą listę</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Introdução: Pressione-me para ver notas</string>
<string name="intro_task_1_summary">Crie sua primeira tarefa</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Adicionar widget na área de trabalho</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Sincronizar a instalação com o Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

@ -485,13 +485,6 @@
<string name="gtasks_error_accountNotFound">Account %s not found--please log out and log back in from the Google Tasks settings.</string>
<string name="gtasks_error_authRefresh">Unable to authenticate with Google Tasks. Please check your account password or try again later.</string>
<string name="gtasks_error_accountManager">Error in your phone\'s account manager. Please log out and log back in from the Google Tasks settings.</string>
<string name="intro_click_prompt">Intro: Press me to see notes</string>
<string name="intro_task_1_summary">Create your first task</string>
<string name="intro_task_1_note">Two ways to add a task:\n 1) Quick Add: Type the task into the quick entry box at bottom of screen and press the + button on the right.\n 2) Regular Add: Press the + button of the quick entry box. Add as much detail as you want. Then press \"Save\" or use your phone\'s back button.\n</string>
<string name="intro_task_2_summary">Add a widget to your desktop</string>
<string name="intro_task_2_note">1) Long Press on your phone\'s desktop\n      2) Choose \"Widget\"\n      3) Choose the Astrid widget\n      4) Select the list you want and press OK.\n</string>
<string name="intro_task_3_summary">Setup sync with Astrid.com</string>
<string name="intro_task_3_note">1) Press your Menu button\n      2) Choose \"Sync Now\"\n      3) Select \"Astrid.com\"\n      4) Log In &amp; Synchronize!\n</string>
<string name="help_popover_add_task">Start by adding a task or two</string>
<string name="help_popover_tap_task">Tap task to edit and share</string>
<string name="help_popover_list_settings">Tap to edit or share this list</string>

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

Loading…
Cancel
Save