merged master into unifiedtabletphone-ui

fixed NotificationActivity to be shown, also for landscape
pull/14/head
Arne Jans 14 years ago
parent 231a34448e
commit 6511d7e594

@ -1,2 +0,0 @@
# output files and apk
out.dir=antbuild

@ -49,6 +49,10 @@ public class Field extends DBObject<Field> {
return UnaryCriterion.gt(this, value); return UnaryCriterion.gt(this, value);
} }
public Criterion gte(Object value) {
return UnaryCriterion.gte(this, value);
}
public Criterion lt(final Object value) { public Criterion lt(final Object value) {
return UnaryCriterion.lt(this, value); return UnaryCriterion.lt(this, value);
} }

@ -1,5 +1,6 @@
package com.todoroo.andlib.sql; package com.todoroo.andlib.sql;
import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.Property.StringProperty;
@ -50,4 +51,8 @@ public final class Functions {
return new Field("LENGTH(" + field.toString() + ")"); return new Field("LENGTH(" + field.toString() + ")");
} }
public static Field bitwiseAnd(IntegerProperty field, int value) {
return new Field(field.toString() + " & " + value);
}
} }

@ -59,6 +59,10 @@ public class UnaryCriterion extends Criterion {
return new UnaryCriterion(field, Operator.gt, value); return new UnaryCriterion(field, Operator.gt, value);
} }
public static Criterion gte(Field field, Object value) {
return new UnaryCriterion(field, Operator.gte, value);
}
public static Criterion lt(Field field, Object value) { public static Criterion lt(Field field, Object value) {
return new UnaryCriterion(field, Operator.lt, value); return new UnaryCriterion(field, Operator.lt, value);
} }

@ -38,6 +38,7 @@ import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.View.OnTouchListener; import android.view.View.OnTouchListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView; import android.widget.TextView;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
@ -684,4 +685,16 @@ public class AndroidUtilities {
return string.substring(0, 1).toUpperCase() + string.substring(1); return string.substring(0, 1).toUpperCase() + string.substring(1);
} }
/**
* Dismiss the keyboard if it is displayed by any of the listed views
* @param context
* @param views - a list of views that might potentially be displaying the keyboard
*/
public static void hideSoftInputForViews(Context context, View...views) {
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
for (View v : views) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
} }

@ -110,6 +110,10 @@ public final class TagData extends RemoteModel {
public static final IntegerProperty TASK_COUNT = new IntegerProperty( public static final IntegerProperty TASK_COUNT = new IntegerProperty(
TABLE, "taskCount"); TABLE, "taskCount");
/** Tag Desription */
public static final StringProperty TAG_DESCRIPTION = new StringProperty(
TABLE, "tagDescription");
/** List of all properties for this model */ /** List of all properties for this model */
public static final Property<?>[] PROPERTIES = generateProperties(TagData.class); public static final Property<?>[] PROPERTIES = generateProperties(TagData.class);
@ -146,6 +150,7 @@ public final class TagData extends RemoteModel {
defaultValues.put(LAST_ACTIVITY_DATE.name, 0); defaultValues.put(LAST_ACTIVITY_DATE.name, 0);
defaultValues.put(IS_UNREAD.name, 0); defaultValues.put(IS_UNREAD.name, 0);
defaultValues.put(TASK_COUNT.name, 0); defaultValues.put(TASK_COUNT.name, 0);
defaultValues.put(TAG_DESCRIPTION.name, "");
} }
@Override @Override

@ -251,6 +251,7 @@ public final class Task extends RemoteModel {
defaultValues.put(LAST_SYNC.name, 0); defaultValues.put(LAST_SYNC.name, 0);
defaultValues.put(REMOTE_ID.name, 0); defaultValues.put(REMOTE_ID.name, 0);
defaultValues.put(USER_ID.name, 0); defaultValues.put(USER_ID.name, 0);
defaultValues.put(CREATOR_ID.name, 0);
defaultValues.put(USER.name, "{}"); defaultValues.put(USER.name, "{}");
defaultValues.put(SHARED_WITH.name, "{}"); defaultValues.put(SHARED_WITH.name, "{}");
} }

@ -8,6 +8,7 @@ import com.todoroo.andlib.data.ContentResolverDao;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
@ -91,6 +92,23 @@ public class TaskApiDao extends ContentResolverDao<Task> {
return Criterion.or(Task.TITLE.isNull(), Task.TITLE.eq("")); return Criterion.or(Task.TITLE.isNull(), Task.TITLE.eq(""));
} }
/** @return tasks that have not yet been completed or deleted */
public static Criterion activeVisibleMine() {
return Criterion.and(Task.COMPLETION_DATE.eq(0),
Task.DELETION_DATE.eq(0),
Task.HIDE_UNTIL.lt(Functions.now()),
Field.field(Task.FLAGS.name + " & " + //$NON-NLS-1$
Task.FLAG_IS_READONLY).eq(0),
Task.USER_ID.eq(0));
}
/** Check if a given task belongs to someone else & is read-only */
public static Criterion ownedByMe() {
return Criterion.and(Field.field(Task.FLAGS.name+ " & " + //$NON-NLS-1$
Task.FLAG_IS_READONLY).eq(0),
Task.USER_ID.eq(0));
}
} }
/** /**

@ -81,7 +81,7 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
*/ */
public TodorooCursor<Task> getLocallyCreated(Property<?>... properties) { public TodorooCursor<Task> getLocallyCreated(Property<?>... properties) {
TodorooCursor<Task> tasks = taskDao.query(Query.select(Task.ID).where( TodorooCursor<Task> tasks = taskDao.query(Query.select(Task.ID).where(
TaskCriteria.isActive()).orderBy(Order.asc(Task.ID))); Criterion.and(TaskCriteria.isActive(), TaskCriteria.ownedByMe())).orderBy(Order.asc(Task.ID)));
return joinWithMetadata(tasks, false, properties); return joinWithMetadata(tasks, false, properties);
} }
@ -97,8 +97,8 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
if(lastSyncDate == 0) if(lastSyncDate == 0)
tasks = taskDao.query(Query.select(Task.ID).where(Criterion.none)); tasks = taskDao.query(Query.select(Task.ID).where(Criterion.none));
else else
tasks = taskDao.query(Query.select(Task.ID).where( tasks = taskDao.query(Query.select(Task.ID).where(Criterion.and(TaskCriteria.ownedByMe(), Task.MODIFICATION_DATE.gt(lastSyncDate)))
Task.MODIFICATION_DATE.gt(lastSyncDate)).orderBy(Order.asc(Task.ID))); .orderBy(Order.asc(Task.ID)));
tasks = filterLocallyUpdated(tasks, lastSyncDate); tasks = filterLocallyUpdated(tasks, lastSyncDate);
return joinWithMetadata(tasks, true, properties); return joinWithMetadata(tasks, true, properties);

@ -6,6 +6,7 @@
<classpathentry excluding="com/todoroo/astrid/rmilk/EditOperationExposer.java|com/todoroo/astrid/rmilk/MilkEditActivity.java|com/todoroo/astrid/actfm/TaskFields.java|com/todoroo/astrid/actfm/ShowProjectExposer.java|com/todoroo/astrid/actfm/ProjectDetailExposer.java|com/todoroo/astrid/actfm/ProjectListActivity.java" kind="src" path="plugin-src"/> <classpathentry excluding="com/todoroo/astrid/rmilk/EditOperationExposer.java|com/todoroo/astrid/rmilk/MilkEditActivity.java|com/todoroo/astrid/actfm/TaskFields.java|com/todoroo/astrid/actfm/ShowProjectExposer.java|com/todoroo/astrid/actfm/ProjectDetailExposer.java|com/todoroo/astrid/actfm/ProjectListActivity.java" kind="src" path="plugin-src"/>
<classpathentry kind="src" path="gen"/> <classpathentry kind="src" path="gen"/>
<classpathentry kind="src" path="rmilk-src"/> <classpathentry kind="src" path="rmilk-src"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="lib" path="libs/annotations.jar"/> <classpathentry exported="true" kind="lib" path="libs/annotations.jar"/>
<classpathentry exported="true" kind="lib" path="libs/commons-codec-1.3.jar"/> <classpathentry exported="true" kind="lib" path="libs/commons-codec-1.3.jar"/>
@ -26,7 +27,6 @@
<classpathentry exported="true" kind="lib" path="libs/google-oauth-client-extensions-1.5.0-beta.jar"/> <classpathentry exported="true" kind="lib" path="libs/google-oauth-client-extensions-1.5.0-beta.jar"/>
<classpathentry exported="true" kind="lib" path="libs/gson-1.6.jar"/> <classpathentry exported="true" kind="lib" path="libs/gson-1.6.jar"/>
<classpathentry exported="true" kind="lib" path="libs/google-api-services-tasks-v1-1.2.5-beta.jar"/> <classpathentry exported="true" kind="lib" path="libs/google-api-services-tasks-v1-1.2.5-beta.jar"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="lib" path="libs/crittercism_v1_1_3.jar"/> <classpathentry kind="lib" path="libs/crittercism_v1_1_3.jar"/>
<classpathentry kind="output" path="bin/classes"/> <classpathentry kind="output" path="bin/classes"/>
</classpath> </classpath>

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.timsu.astrid" package="com.timsu.astrid"
android:versionName="3.9.1" android:versionName="3.9.1.1"
android:versionCode="204"> android:versionCode="206">
<!-- widgets, alarms, and services will break if Astrid is installed on SD card --> <!-- widgets, alarms, and services will break if Astrid is installed on SD card -->
<!-- android:installLocation="internalOnly"> --> <!-- android:installLocation="internalOnly"> -->
@ -547,9 +547,8 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<activity android:name="com.todoroo.astrid.reminders.NotificationActivity" <activity android:name="com.todoroo.astrid.reminders.NotificationWrapperActivity"
android:launchMode="singleTask" android:launchMode="singleTask"
android:screenOrientation="portrait"
android:finishOnTaskLaunch="true" android:finishOnTaskLaunch="true"
android:clearTaskOnLaunch="true"> android:clearTaskOnLaunch="true">
</activity> </activity>

@ -65,6 +65,7 @@ import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
@ -101,6 +102,9 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
private TextView errors; private TextView errors;
protected boolean noSync = false; protected boolean noSync = false;
public static final String SHOW_TOAST = "show_toast";
private boolean showToast;
// --- ui initialization // --- ui initialization
private static final int REQUEST_CODE_GOOGLE_ACCOUNTS = 1; private static final int REQUEST_CODE_GOOGLE_ACCOUNTS = 1;
@ -137,6 +141,8 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
rand = new Random(DateUtilities.now()); rand = new Random(DateUtilities.now());
noSync = getIntent().getBooleanExtra(EXTRA_DO_NOT_SYNC, false); noSync = getIntent().getBooleanExtra(EXTRA_DO_NOT_SYNC, false);
showToast = getIntent().getBooleanExtra(SHOW_TOAST, true);
facebook = new Facebook(APP_ID); facebook = new Facebook(APP_ID);
facebookRunner = new AsyncFacebookRunner(facebook); facebookRunner = new AsyncFacebookRunner(facebook);
@ -287,6 +293,7 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
public void onClick(DialogInterface dlg, int which) { public void onClick(DialogInterface dlg, int which) {
String nameString = isNew.get() ? name.getText().toString() String nameString = isNew.get() ? name.getText().toString()
: null; : null;
AndroidUtilities.hideSoftInputForViews(ActFmLoginActivity.this, name, email, password);
authenticate(email.getText().toString(), authenticate(email.getText().toString(),
nameString, ActFmInvoker.PROVIDER_PASSWORD, nameString, ActFmInvoker.PROVIDER_PASSWORD,
password.getText().toString()); password.getText().toString());
@ -296,7 +303,12 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
else else
StatisticsService.reportEvent(StatisticsConstants.ACTFM_SIGNUP_PW); StatisticsService.reportEvent(StatisticsConstants.ACTFM_SIGNUP_PW);
} }
}).setNegativeButton(android.R.string.cancel, null).show()); }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dlg, int which) {
AndroidUtilities.hideSoftInputForViews(ActFmLoginActivity.this, name, email, password);
}
}).show());
dialog.get().setOwnerActivity(ActFmLoginActivity.this); dialog.get().setOwnerActivity(ActFmLoginActivity.this);
} }
@ -471,7 +483,7 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
finish(); finish();
if (!noSync) { if (!noSync) {
new ActFmSyncProvider().synchronize(ActFmLoginActivity.this); new ActFmSyncProvider().synchronize(ActFmLoginActivity.this, showToast);
} }
try { try {

@ -100,6 +100,8 @@ public class EditPeopleControlSet extends PopupControlSet {
private final int loginRequestCode; private final int loginRequestCode;
private boolean assignedToMe = false;
static { static {
AstridDependencyInjector.initialize(); AstridDependencyInjector.initialize();
} }
@ -494,6 +496,8 @@ public class EditPeopleControlSet extends PopupControlSet {
task.setValue(Task.USER_ID, Task.USER_ID_SELF); task.setValue(Task.USER_ID, Task.USER_ID_SELF);
if(!TextUtils.isEmpty(task.getValue(Task.USER))) if(!TextUtils.isEmpty(task.getValue(Task.USER)))
task.setValue(Task.USER, ""); task.setValue(Task.USER, "");
assignedToMe = true;
} else if(userJson.optLong("id") == Task.USER_ID_UNASSIGNED) { } else if(userJson.optLong("id") == Task.USER_ID_UNASSIGNED) {
dirty = task.getValue(Task.USER_ID) == Task.USER_ID_UNASSIGNED ? dirty : true; dirty = task.getValue(Task.USER_ID) == Task.USER_ID_UNASSIGNED ? dirty : true;
task.setValue(Task.USER_ID, Task.USER_ID_UNASSIGNED); task.setValue(Task.USER_ID, Task.USER_ID_UNASSIGNED);
@ -685,6 +689,18 @@ public class EditPeopleControlSet extends PopupControlSet {
return values.toArray(new Object[values.size()]); return values.toArray(new Object[values.size()]);
} }
/**
* Warning - only valid after a call to saveSharingSettings
* @return
*/
public boolean isAssignedToMe() {
return assignedToMe;
}
public String getAssignedToString() {
return assignedDisplay.getText().toString();
}
/** Resume save /** Resume save
* @param data */ * @param data */
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {

@ -61,6 +61,7 @@ public class TagSettingsActivity extends Activity {
private PeopleContainer tagMembers; private PeopleContainer tagMembers;
private AsyncImageView picture; private AsyncImageView picture;
private EditText tagName; private EditText tagName;
private EditText tagDescription;
private CheckBox isSilent; private CheckBox isSilent;
boolean isNewTag = false; boolean isNewTag = false;
@ -111,11 +112,14 @@ public class TagSettingsActivity extends Activity {
protected void setUpSettingsPage() { protected void setUpSettingsPage() {
tagMembers = (PeopleContainer) findViewById(R.id.members_container); tagMembers = (PeopleContainer) findViewById(R.id.members_container);
tagName = (EditText) findViewById(R.id.tag_name); tagName = (EditText) findViewById(R.id.tag_name);
tagDescription = (EditText) findViewById(R.id.tag_description);
picture = (AsyncImageView) findViewById(R.id.picture); picture = (AsyncImageView) findViewById(R.id.picture);
isSilent = (CheckBox) findViewById(R.id.tag_silenced); isSilent = (CheckBox) findViewById(R.id.tag_silenced);
isSilent.setChecked(tagData.getFlag(TagData.FLAGS, TagData.FLAG_SILENT));
if(actFmPreferenceService.isLoggedIn()) { if(actFmPreferenceService.isLoggedIn()) {
picture.setVisibility(View.VISIBLE); picture.setVisibility(View.VISIBLE);
findViewById(R.id.picture_label).setVisibility(View.VISIBLE);
findViewById(R.id.listSettingsMore).setVisibility(View.VISIBLE); findViewById(R.id.listSettingsMore).setVisibility(View.VISIBLE);
} }
@ -146,7 +150,7 @@ public class TagSettingsActivity extends Activity {
private void saveSettings() { private void saveSettings() {
setResult(RESULT_OK); setResult(RESULT_OK);
String oldName = tagData.getValue(TagData.NAME); String oldName = tagData.getValue(TagData.NAME);
String newName = tagName.getText().toString(); String newName = tagName.getText().toString().trim();
if (TextUtils.isEmpty(newName)) { if (TextUtils.isEmpty(newName)) {
return; return;
@ -171,6 +175,10 @@ public class TagSettingsActivity extends Activity {
} }
} }
} }
//handles description part
String newDesc = tagDescription.getText().toString();
tagData.setValue(TagData.TAG_DESCRIPTION, newDesc);
JSONArray members = tagMembers.toJSONArray(); JSONArray members = tagMembers.toJSONArray();
@ -210,6 +218,8 @@ public class TagSettingsActivity extends Activity {
return; return;
} }
refreshSettingsPage(); refreshSettingsPage();
finish(); finish();
} }
@ -256,6 +266,9 @@ public class TagSettingsActivity extends Activity {
String peopleJson = tagData.getValue(TagData.MEMBERS); String peopleJson = tagData.getValue(TagData.MEMBERS);
updateMembers(peopleJson); updateMembers(peopleJson);
tagDescription.setText(tagData.getValue(TagData.TAG_DESCRIPTION));
} }
@SuppressWarnings("nls") @SuppressWarnings("nls")

@ -234,13 +234,15 @@ public class TagUpdatesActivity extends ListActivity {
updateDao.createNew(update); updateDao.createNew(update);
final long updateId = update.getId(); final long updateId = update.getId();
final Bitmap tempPicture = picture;
new Thread() { new Thread() {
@Override @Override
public void run() { public void run() {
actFmSyncService.pushUpdate(updateId, picture); actFmSyncService.pushUpdate(updateId, tempPicture);
} }
}.start(); }.start();
addCommentField.setText(""); //$NON-NLS-1$ addCommentField.setText(""); //$NON-NLS-1$
picture = null;
pictureButton.setImageResource(R.drawable.icn_camera); pictureButton.setImageResource(R.drawable.icn_camera);
refreshUpdatesList(); refreshUpdatesList();

@ -195,8 +195,10 @@ public final class ActFmSyncService {
} }
if(failedPushes.size() > 0) { if(failedPushes.size() > 0) {
// Copy into a second queue so we don't end up infinitely retrying in the same loop // Copy into a second queue so we don't end up infinitely retrying in the same loop
Queue<FailedPush> toTry = new LinkedList<FailedPush>(failedPushes); Queue<FailedPush> toTry = new LinkedList<FailedPush>();
failedPushes.clear(); while (failedPushes.size() > 0) {
toTry.add(failedPushes.remove(0));
}
while(!toTry.isEmpty() && !actFmPreferenceService.isOngoing()) { while(!toTry.isEmpty() && !actFmPreferenceService.isOngoing()) {
FailedPush pushOp = toTry.remove(); FailedPush pushOp = toTry.remove();
switch(pushOp.pushType) { switch(pushOp.pushType) {
@ -410,7 +412,8 @@ public final class ActFmSyncService {
*/ */
public void pushTask(long taskId) { public void pushTask(long taskId) {
Task task = taskService.fetchById(taskId, Task.PROPERTIES); Task task = taskService.fetchById(taskId, Task.PROPERTIES);
pushTaskOnSave(task, task.getMergedValues()); if (task != null)
pushTaskOnSave(task, task.getMergedValues());
} }
/** /**
@ -419,7 +422,8 @@ public final class ActFmSyncService {
*/ */
public void pushTag(long tagId) { public void pushTag(long tagId) {
TagData tagData = tagDataService.fetchById(tagId, TagData.PROPERTIES); TagData tagData = tagDataService.fetchById(tagId, TagData.PROPERTIES);
pushTagDataOnSave(tagData, tagData.getMergedValues()); if (tagData != null)
pushTagDataOnSave(tagData, tagData.getMergedValues());
} }
/** /**
@ -428,7 +432,8 @@ public final class ActFmSyncService {
*/ */
public void pushUpdate(long updateId) { public void pushUpdate(long updateId) {
Update update = updateDao.fetch(updateId, Update.PROPERTIES); Update update = updateDao.fetch(updateId, Update.PROPERTIES);
pushUpdateOnSave(update, update.getMergedValues(), null); if (update != null)
pushUpdateOnSave(update, update.getMergedValues(), null);
} }
/** /**
@ -466,6 +471,10 @@ public final class ActFmSyncService {
params.add("deleted_at"); params.add(tagData.getValue(TagData.DELETION_DATE)); params.add("deleted_at"); params.add(tagData.getValue(TagData.DELETION_DATE));
} }
if(values.containsKey(TagData.TAG_DESCRIPTION.name)) {
params.add("description"); params.add(tagData.getValue(TagData.TAG_DESCRIPTION));
}
if(values.containsKey(TagData.MEMBERS.name)) { if(values.containsKey(TagData.MEMBERS.name)) {
params.add("members"); params.add("members");
try { try {
@ -991,6 +1000,9 @@ public final class ActFmSyncService {
if(json.has("emergent")) if(json.has("emergent"))
model.setFlag(TagData.FLAGS, TagData.FLAG_EMERGENT,json.getBoolean("emergent")); model.setFlag(TagData.FLAGS, TagData.FLAG_EMERGENT,json.getBoolean("emergent"));
if(!json.isNull("description"))
model.setValue(TagData.TAG_DESCRIPTION, json.getString("description"));
if(json.has("members")) { if(json.has("members")) {
JSONArray members = json.getJSONArray("members"); JSONArray members = json.getJSONArray("members");
model.setValue(TagData.MEMBERS, members.toString()); model.setValue(TagData.MEMBERS, members.toString());

@ -20,9 +20,9 @@ import com.todoroo.astrid.api.AstridFilterExposer;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
/** /**

@ -47,8 +47,8 @@ import com.todoroo.astrid.api.MultipleSelectCriterion;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.api.TextInputCriterion; import com.todoroo.astrid.api.TextInputCriterion;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.StatisticsService;
/** /**

@ -24,6 +24,7 @@ import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.activity.FilterListActivity; import com.todoroo.astrid.activity.FilterListActivity;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.AstridFilterExposer; import com.todoroo.astrid.api.AstridFilterExposer;
@ -31,12 +32,11 @@ import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.service.TagDataService; import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.tags.TagService;
/** /**
* Exposes Astrid's built in filters to the {@link FilterListActivity} * Exposes Astrid's built in filters to the {@link FilterListActivity}
@ -66,18 +66,7 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
Resources r = context.getResources(); Resources r = context.getResources();
//PendingIntent customFilterIntent = PendingIntent.getActivity(context, 0,
// new Intent(context, CustomFilterActivity.class), 0);
Filter[] savedFilters = buildSavedFilters(context, r); Filter[] savedFilters = buildSavedFilters(context, r);
//FilterCategoryWithNewButton heading = new FilterCategoryWithNewButton(r.getString(R.string.BFE_Saved), savedFilters);
//heading.label = r.getString(R.string.tag_FEx_add_new);
//heading.intent = customFilterIntent;
//FilterListItem[] list = new FilterListItem[1];
//list[0] = heading;
return savedFilters; return savedFilters;
} }
@ -109,13 +98,7 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
null); null);
list[1].listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_pencil)).getBitmap(); list[1].listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_pencil)).getBitmap();
int untaggedLabel = gtasksPreferenceService.isLoggedIn() ? list[2] = getAssignedByMeFilter(r);
R.string.tag_FEx_untagged_w_astrid : R.string.tag_FEx_untagged;
list[2] = new Filter(r.getString(untaggedLabel),
r.getString(R.string.tag_FEx_untagged),
TagService.untaggedTemplate(),
null);;
list[2].listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.gl_lists)).getBitmap();
StoreObject savedFilter = new StoreObject(); StoreObject savedFilter = new StoreObject();
for(int i = 3; i < list.length; i++) { for(int i = 3; i < list.length; i++) {
@ -137,6 +120,17 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
} }
} }
public static Filter getAssignedByMeFilter(Resources r) {
Filter f = new Filter(r.getString(R.string.BFE_Assigned),
r.getString(R.string.BFE_Assigned),
new QueryTemplate().where(Criterion.and(TaskCriteria.isActive(),
Criterion.or(Task.CREATOR_ID.eq(0), Task.CREATOR_ID.eq(ActFmPreferenceService.userId())),
Task.USER_ID.neq(0))),
null);
f.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_assigned)).getBitmap();
return f;
}
/** /**
* Simple activity for deleting stuff * Simple activity for deleting stuff
* *

@ -25,14 +25,13 @@ public class Calendars {
private static final String ID_COLUMN_NAME = "_id"; private static final String ID_COLUMN_NAME = "_id";
private static final boolean USE_ICS_NAMES = AndroidUtilities.getSdkVersion() >= 14; private static final boolean USE_ICS_NAMES = AndroidUtilities.getSdkVersion() >= 14;
private static final String ICS_CALENDAR_PREFIX = "calendar_"; private static final String DISPLAY_COLUMN_NAME = (USE_ICS_NAMES ? CalendarContract.Calendars.CALENDAR_DISPLAY_NAME : "displayName");
private static final String DISPLAY_COLUMN_NAME = (USE_ICS_NAMES ? ICS_CALENDAR_PREFIX : "") + "displayName"; private static final String ACCES_LEVEL_COLUMN_NAME = (USE_ICS_NAMES ? CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL : "access_level");
private static final String ACCES_LEVEL_COLUMN_NAME = (USE_ICS_NAMES ? ICS_CALENDAR_PREFIX : "") + "access_level";
private static final String[] CALENDARS_PROJECTION = new String[] { private static final String[] CALENDARS_PROJECTION = new String[] {
ID_COLUMN_NAME, // Calendars._ID, ID_COLUMN_NAME,
DISPLAY_COLUMN_NAME // Calendars.DISPLAY_NAME DISPLAY_COLUMN_NAME,
}; };
// Only show calendars that the user can modify. Access level 500 // Only show calendars that the user can modify. Access level 500

@ -77,6 +77,15 @@ public class NotificationActivity extends TaskListActivity implements OnTimeSetL
StartupService.bypassInitialization(); StartupService.bypassInitialization();
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
}
/* (non-Javadoc)
* @see com.todoroo.astrid.activity.TaskListActivity#onActivityCreated(android.os.Bundle)
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
displayNotificationPopup(); displayNotificationPopup();
} }

@ -0,0 +1,21 @@
package com.todoroo.astrid.reminders;
import android.os.Bundle;
import com.timsu.astrid.R;
import com.todoroo.astrid.activity.AstridWrapperActivity;
import com.todoroo.astrid.service.ThemeService;
public class NotificationWrapperActivity extends AstridWrapperActivity {
/* (non-Javadoc)
* @see com.todoroo.astrid.activity.AstridWrapperActivity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
ThemeService.applyTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_wrapper_activity);
}
}

@ -162,7 +162,7 @@ public class Notifications extends BroadcastReceiver {
String title = context.getString(R.string.app_name); String title = context.getString(R.string.app_name);
String text = reminder + " " + taskTitle; //$NON-NLS-1$ String text = reminder + " " + taskTitle; //$NON-NLS-1$
Intent notifyIntent = new Intent(context, NotificationActivity.class); Intent notifyIntent = new Intent(context, NotificationWrapperActivity.class);
notifyIntent.setAction("NOTIFY" + id); //$NON-NLS-1$ notifyIntent.setAction("NOTIFY" + id); //$NON-NLS-1$
notifyIntent.putExtra(NotificationActivity.TOKEN_ID, id); notifyIntent.putExtra(NotificationActivity.TOKEN_ID, id);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

@ -25,6 +25,7 @@ import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
@ -483,7 +484,7 @@ public final class ReminderService {
private TodorooCursor<Task> getTasksWithReminders(Property<?>... properties) { private TodorooCursor<Task> getTasksWithReminders(Property<?>... properties) {
return taskDao.query(Query.select(properties).where(Criterion.and( return taskDao.query(Query.select(properties).where(Criterion.and(
TaskCriteria.isActive(), TaskCriteria.isActive(),
TaskCriteria.ownedByMe(), TaskApiDao.TaskCriteria.ownedByMe(),
Criterion.or(Task.REMINDER_FLAGS.gt(0), Task.REMINDER_PERIOD.gt(0))))); Criterion.or(Task.REMINDER_FLAGS.gt(0), Task.REMINDER_PERIOD.gt(0)))));
} }

@ -98,7 +98,6 @@ public class RepeatControlSet extends PopupControlSet {
LinearLayout.LayoutParams textLp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.0f/14); LinearLayout.LayoutParams textLp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.0f/14);
for(int i = 0; i < 7; i++) { for(int i = 0; i < 7; i++) {
CheckBox checkBox = new CheckBox(activity); CheckBox checkBox = new CheckBox(activity);
checkBox.setTextColor(activity.getResources().getColor(android.R.color.white));
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
checkBox.setPadding(0, 0, 0, 0); checkBox.setPadding(0, 0, 0, 0);
checkBox.setLayoutParams(lp); checkBox.setLayoutParams(lp);
@ -107,7 +106,7 @@ public class RepeatControlSet extends PopupControlSet {
checkBox.setButtonDrawable(R.drawable.btn_check_small); checkBox.setButtonDrawable(R.drawable.btn_check_small);
TextView label = new TextView(activity); TextView label = new TextView(activity);
label.setTextAppearance(activity, android.R.style.TextAppearance); label.setTextAppearance(activity, R.style.TextAppearance_GEN_EditLabel);
label.setLayoutParams(textLp); label.setLayoutParams(textLp);
label.setTextSize(14); label.setTextSize(14);
label.setText(dfs.getShortWeekdays()[dayOfWeek].substring(0, 1)); label.setText(dfs.getShortWeekdays()[dayOfWeek].substring(0, 1));

@ -14,6 +14,7 @@ import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle; import android.os.Bundle;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
@ -128,7 +129,6 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
ArrayList<FilterListItem> list = new ArrayList<FilterListItem>(); ArrayList<FilterListItem> list = new ArrayList<FilterListItem>();
// --- untagged
addTags(list); addTags(list);
// transmit filter list // transmit filter list
@ -143,12 +143,23 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
} }
private FilterCategory filterFromTags(Tag[] tags, int name) { private FilterCategory filterFromTags(Tag[] tags, int name) {
Filter[] filters = new Filter[tags.length]; Filter[] filters = new Filter[tags.length + 1];
Resources r = ContextManager.getContext().getResources();
Context context = ContextManager.getContext(); Context context = ContextManager.getContext();
Resources r = context.getResources();
// --- untagged
int untaggedLabel = gtasksPreferenceService.isLoggedIn() ?
R.string.tag_FEx_untagged_w_astrid : R.string.tag_FEx_untagged;
Filter untagged = new Filter(r.getString(untaggedLabel),
r.getString(R.string.tag_FEx_untagged),
TagService.untaggedTemplate(),
null);
untagged.listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.gl_lists)).getBitmap();
filters[0] = untagged;
for(int i = 0; i < tags.length; i++) for(int i = 0; i < tags.length; i++)
filters[i] = filterFromTag(context, tags[i], TaskCriteria.activeAndVisible()); filters[i+1] = filterFromTag(context, tags[i], TaskCriteria.activeAndVisible());
FilterCategory filter = new FilterCategory(context.getString(name), filters); FilterCategory filter = new FilterCategory(context.getString(name), filters);
return filter; return filter;
} }

@ -30,6 +30,7 @@ import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao;
import com.todoroo.astrid.data.Update; import com.todoroo.astrid.data.Update;
import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TagDataService; import com.todoroo.astrid.service.TagDataService;
@ -145,7 +146,7 @@ public final class TagService {
return new QueryTemplate().where(Criterion.and( return new QueryTemplate().where(Criterion.and(
Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where(MetadataCriteria.withKey(KEY)))), Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where(MetadataCriteria.withKey(KEY)))),
TaskCriteria.isActive(), TaskCriteria.isActive(),
TaskCriteria.ownedByMe(), TaskApiDao.TaskCriteria.ownedByMe(),
TaskCriteria.isVisible())); TaskCriteria.isVisible()));
} }

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dip"
android:color="@color/task_edit_deadline_gray"/>
<corners
android:bottomLeftRadius="5dip"/>
<solid android:color="@android:color/transparent"/>
</shape>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dip"
android:color="@color/task_edit_deadline_gray"/>
<solid
android:color="@color/task_edit_details"/>
<corners
android:bottomLeftRadius="5dip"/>
</shape>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dip"
android:color="@color/task_edit_deadline_gray"/>
<corners
android:bottomRightRadius="5dip"/>
<solid android:color="@android:color/transparent"/>
</shape>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dip"
android:color="@color/task_edit_deadline_gray"/>
<solid
android:color="@color/task_edit_details"/>
<corners
android:bottomRightRadius="5dip"/>
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/importance_1" />
<corners
android:bottomLeftRadius="4dp"
android:topLeftRadius="4dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/importance_2" />
<corners
android:bottomLeftRadius="4dp"
android:topLeftRadius="4dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/importance_3" />
<corners
android:bottomLeftRadius="4dp"
android:topLeftRadius="4dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/importance_4" />
<corners
android:bottomLeftRadius="4dp"
android:topLeftRadius="4dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/importance_5" />
<corners
android:bottomLeftRadius="4dp"
android:topLeftRadius="4dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/importance_6" />
<corners
android:bottomLeftRadius="4dp"
android:topLeftRadius="4dp" />
</shape>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dip"
android:color="@color/task_edit_deadline_gray"/>
<corners
android:topLeftRadius="5dip"
android:bottomLeftRadius="5dip"/>
<solid android:color="@android:color/transparent"/>
</shape>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dip"
android:color="@color/task_edit_deadline_gray"/>
<solid
android:color="@color/task_edit_details"/>
<corners
android:topLeftRadius="5dip"
android:bottomLeftRadius="5dip"/>
</shape>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dip"
android:color="@color/task_edit_deadline_gray"/>
<corners
android:topRightRadius="5dip"
android:bottomRightRadius="5dip"/>
<solid android:color="@android:color/transparent"/>
</shape>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="2dip"
android:color="@color/task_edit_deadline_gray"/>
<solid
android:color="@color/task_edit_details"/>
<corners
android:topRightRadius="5dip"
android:bottomRightRadius="5dip"/>
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

@ -4,7 +4,7 @@
xmlns:astrid="http://schemas.android.com/apk/res/com.timsu.astrid" xmlns:astrid="http://schemas.android.com/apk/res/com.timsu.astrid"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@android:drawable/list_selector_background" android:background="?attr/asContentBackground"
android:padding="4dip" android:padding="4dip"
android:paddingRight="6dip" android:paddingRight="6dip"
android:orientation="horizontal"> android:orientation="horizontal">

@ -21,7 +21,7 @@
android:layout_marginRight="15dip" android:layout_marginRight="15dip"
android:text="@string/TEA_note_label" android:text="@string/TEA_note_label"
style="@style/TextAppearance.GEN_EditLabel" /> style="@style/TextAppearance.GEN_EditLabel" />
<TextView <com.todoroo.astrid.ui.TextViewWithMeasureListener
android:id="@+id/notes_display" android:id="@+id/notes_display"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"

@ -4,6 +4,9 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:paddingBottom="5dip"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout android:id="@+id/repeatContainer" <LinearLayout android:id="@+id/repeatContainer"
@ -48,16 +51,21 @@
android:layout_weight="1" android:layout_weight="1"
android:layout_marginTop="15dip" android:layout_marginTop="15dip"
android:layout_marginBottom="-15dip"> android:layout_marginBottom="-15dip">
<include layout="@layout/control_dialog_ok"/> <include layout="@layout/control_dialog_ok"
android:layout_marginRight="3dip"/>
<Button xmlns:android="http://schemas.android.com/apk/res/android" <Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/edit_dont_repeat" android:id="@+id/edit_dont_repeat"
android:text="@string/repeat_dont"
android:layout_width="150dip" android:layout_width="150dip"
android:layout_height="50dip" android:layout_height="45dip"
android:layout_marginTop="15dip" android:layout_marginTop="10dip"
android:layout_marginBottom="10dip" android:layout_marginBottom="5dip"
android:layout_weight="1" android:layout_weight="1"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:text="@string/repeat_dont"/> android:layout_marginLeft="3dip"
android:background="@drawable/footer_editbutton"
android:textStyle="bold"
android:layout_alignParentBottom="true" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.todoroo.astrid.reminders.NotificationActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/notification_fragment">
</fragment>

@ -43,22 +43,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingBottom="10dip"> android:paddingBottom="10dip">
<greendroid.widget.AsyncImageView
android:id="@+id/picture"
android:layout_width="80dip"
android:layout_height="80dip"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:scaleType="fitCenter"
android:paddingRight="10dip"
android:visibility="gone"
astrid:defaultSrc="@android:drawable/ic_menu_gallery" />
<TextView <TextView
android:id="@+id/tag_label" android:id="@+id/tag_label"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@id/picture"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_marginTop="10dip" android:layout_marginTop="10dip"
style="@style/TextAppearance.GEN_EditLabel" style="@style/TextAppearance.GEN_EditLabel"
@ -68,7 +56,6 @@
android:id="@+id/tag_name" android:id="@+id/tag_name"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@id/picture"
android:layout_below="@id/tag_label" android:layout_below="@id/tag_label"
android:layout_marginTop="10dip" /> android:layout_marginTop="10dip" />
@ -93,6 +80,57 @@
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<View
android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="@android:drawable/divider_horizontal_dark" />
<RelativeLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<TextView
android:id="@+id/picture_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginTop="10dip"
android:visibility="gone"
style="@style/TextAppearance.GEN_EditLabel"
android:text="@string/actfm_TVA_list_icon_label"/>
<greendroid.widget.AsyncImageView
android:id="@+id/picture"
android:layout_width="80dip"
android:layout_height="80dip"
android:layout_alignParentLeft="true"
android:scaleType="fitCenter"
android:paddingRight="10dip"
android:visibility="gone"
android:layout_below="@id/picture_label"
astrid:defaultSrc="@android:drawable/ic_menu_gallery" />
<TextView
android:id="@+id/description_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/picture"
android:layout_marginTop="10dip"
style="@style/TextAppearance.GEN_EditLabel"
android:text="@string/actfm_TVA_tag_description_label" />
<EditText
android:id="@+id/tag_description"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/picture"
android:layout_below="@id/description_label"
android:layout_marginTop="10dip"
android:hint="@string/actfm_TVA_tag_description_hint" />
</RelativeLayout>
<!-- Footer --> <!-- Footer -->
<LinearLayout <LinearLayout

@ -35,25 +35,12 @@
android:layout_weight="1" android:layout_weight="1"
android:orientation="horizontal"> android:orientation="horizontal">
<!-- Header Logo -->
<!-- <ImageView android:id="@+id/headerLogo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="100"
android:gravity="center"
android:paddingRight="43dip"
android:src="@drawable/header_logo_new"
android:scaleType="center"
android:visibility="gone"/> -->
<!-- List Label --> <!-- List Label -->
<TextView android:id="@+id/listLabel" <TextView android:id="@+id/listLabel"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:layout_marginLeft="5dip" android:layout_marginLeft="5dip"
android:layout_marginRight="5dip" android:layout_marginRight="5dip"
android:paddingRight="50dip"
android:layout_weight="100" android:layout_weight="100"
android:singleLine="true" android:singleLine="true"
android:ellipsize="end" android:ellipsize="end"
@ -80,6 +67,23 @@
android:scaleType="fitCenter" /> android:scaleType="fitCenter" />
</LinearLayout> </LinearLayout>
<LinearLayout android:id="@+id/sortContainer"
android:layout_width="wrap_content"
android:layout_height="fill_parent">
<View
android:layout_width="0.5dip"
android:layout_height="fill_parent"
android:background="#ff222222"/>
<ImageView android:id="@+id/sort_settings"
android:layout_height="fill_parent"
android:layout_width="43dip"
android:background="?attr/asHeaderButtonBackground"
android:padding="7dip"
android:src="@drawable/ic_sort"
android:scaleType="fitCenter" />
</LinearLayout>
</LinearLayout> </LinearLayout>
<!-- Body goes here --> <!-- Body goes here -->

@ -12,12 +12,16 @@
android:orientation="vertical"> android:orientation="vertical">
<!-- No Tasks label --> <!-- No Tasks label -->
<TextView android:id="@android:id/empty" <TextView android:id="@android:id/empty"
android:layout_width="fill_parent" android:drawableTop="@drawable/icon"
android:layout_height="fill_parent" android:layout_width="wrap_content"
android:visibility="gone" android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:visibility="gone"
android:clickable="true"
android:text="@string/TLA_no_items" android:text="@string/TLA_no_items"
style="@style/TextAppearance.TLA_NoItems"/> style="@style/TextAppearance.TLA_NoItems"/>
<!-- Task List --> <!-- Task List -->
<ListView android:id="@android:id/list" <ListView android:id="@android:id/list"
@ -27,4 +31,5 @@
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:smoothScrollbar="false"/> android:smoothScrollbar="false"/>
</android.gesture.GestureOverlayView> </android.gesture.GestureOverlayView>

@ -34,6 +34,18 @@
<!-- filter list activity: refresh tags --> <!-- filter list activity: refresh tags -->
<string name="actfm_FLA_menu_refresh">Refresh Lists</string> <string name="actfm_FLA_menu_refresh">Refresh Lists</string>
<!-- Title for prompt after sharing a task -->
<string name="actfm_view_task_title">View Task?</string>
<!-- Text for prompt after sharing a task -->
<string name="actfm_view_task_text">Task was sent to %s! You\'re currently viewing your own tasks. Do you want to view this and other tasks you\'ve assigned?</string>
<!-- Ok button for task view prompt -->
<string name="actfm_view_task_ok">View Assigned</string>
<!-- Cancel button for task view prompt -->
<string name="actfm_view_task_cancel">Stay Here</string>
<!-- ================================================== TagViewActivity == --> <!-- ================================================== TagViewActivity == -->
<!-- Tag View Activity: Add Comment hint --> <!-- Tag View Activity: Add Comment hint -->
@ -79,6 +91,15 @@
<!-- Tag Settings: silence notifications label --> <!-- Tag Settings: silence notifications label -->
<string name="actfm_TVA_silence_label">Silence Notifications</string> <string name="actfm_TVA_silence_label">Silence Notifications</string>
<!-- Tag Settings: list icon label -->
<string name="actfm_TVA_list_icon_label">List Icon:</string>
<!-- Tag Settings: list description label -->
<string name="actfm_TVA_tag_description_label">Description:</string>
<!-- Tag Settings: list description hint -->
<string name="actfm_TVA_tag_description_hint">List description</string>
<!-- ============================================ edit people dialog == --> <!-- ============================================ edit people dialog == -->
<!-- task sharing dialog: intro --> <!-- task sharing dialog: intro -->

@ -96,7 +96,7 @@
<!-- ================================================= TaskListActivity == --> <!-- ================================================= TaskListActivity == -->
<!-- Task List: Displayed instead of list when no items present --> <!-- Task List: Displayed instead of list when no items present -->
<string name="TLA_no_items">No Tasks!</string> <string name="TLA_no_items">You have no tasks! \n Want to add something?</string>
<!-- Menu: Add-ons --> <!-- Menu: Add-ons -->
<string name="TLA_menu_addons">Add-ons</string> <string name="TLA_menu_addons">Add-ons</string>

@ -15,6 +15,9 @@
<!-- Recently Modified --> <!-- Recently Modified -->
<string name="BFE_Recent">Recently Modified</string> <string name="BFE_Recent">Recently Modified</string>
<!-- I've assigned -->
<string name="BFE_Assigned">I\'ve Assigned</string>
<!-- Build Your Own Filter --> <!-- Build Your Own Filter -->
<string name="BFE_Custom">Custom Filter...</string> <string name="BFE_Custom">Custom Filter...</string>

@ -42,7 +42,7 @@
<!-- help bubbles --> <!-- help bubbles -->
<!-- Shown the first time a user sees the task list activity --> <!-- Shown the first time a user sees the task list activity -->
<string name="help_popover_add_task">Add a task here</string> <string name="help_popover_add_task">Start by adding a task or two</string>
<!-- Shown the first time a user adds a task to a list --> <!-- Shown the first time a user adds a task to a list -->
<string name="help_popover_tap_task">Tap task to edit and share</string> <string name="help_popover_tap_task">Tap task to edit and share</string>

@ -55,6 +55,12 @@ public class DraggableTaskListActivity extends TaskListActivity {
return getActivity().getLayoutInflater().inflate(R.layout.task_list_body_draggable, root, false); return getActivity().getLayoutInflater().inflate(R.layout.task_list_body_draggable, root, false);
} }
@Override
protected void setUpUiComponents() {
super.setUpUiComponents();
getView().findViewById(R.id.sortContainer).setVisibility(View.GONE);
}
// --- task adapter // --- task adapter
/** /**

@ -161,7 +161,7 @@ public class FilterListActivity extends ExpandableListFragment {
// Tell the framework to try to keep this fragment around // Tell the framework to try to keep this fragment around
// during a configuration change. // during a configuration change.
setRetainInstance(true); // setRetainInstance(true);
new StartupService().onStartupApplication(getActivity()); new StartupService().onStartupApplication(getActivity());
} }
@ -256,7 +256,6 @@ public class FilterListActivity extends ExpandableListFragment {
item = menu.add(Menu.NONE, MENU_NEW_FILTER_ID, Menu.NONE, item = menu.add(Menu.NONE, MENU_NEW_FILTER_ID, Menu.NONE,
R.string.FLA_new_filter); R.string.FLA_new_filter);
item.setIcon(android.R.drawable.ic_menu_add); item.setIcon(android.R.drawable.ic_menu_add);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
item = menu.add(Menu.NONE, MENU_SEARCH_ID, Menu.NONE, item = menu.add(Menu.NONE, MENU_SEARCH_ID, Menu.NONE,
R.string.FLA_menu_search); R.string.FLA_menu_search);
@ -476,8 +475,7 @@ public class FilterListActivity extends ExpandableListFragment {
return true; return true;
} }
default: { default: {
TaskListActivity tasklist = (TaskListActivity) getSupportFragmentManager() Fragment tasklist = getSupportFragmentManager().findFragmentById(R.id.tasklist_fragment);
.findFragmentById(R.id.tasklist_fragment);
if (tasklist != null && tasklist.isInLayout()) if (tasklist != null && tasklist.isInLayout())
return tasklist.onOptionsItemSelected(item); return tasklist.onOptionsItemSelected(item);
} }

@ -157,6 +157,10 @@ public final class TaskEditActivity extends Fragment {
public static final String OVERRIDE_FINISH_ANIM = "finishAnim"; //$NON-NLS-1$ public static final String OVERRIDE_FINISH_ANIM = "finishAnim"; //$NON-NLS-1$
public static final String TOKEN_TASK_WAS_ASSIGNED = "task_assigned"; //$NON-NLS-1$
public static final String TOKEN_ASSIGNED_TO = "task_assigned_to"; //$NON-NLS-1$
// --- services // --- services
@Autowired @Autowired
@ -627,7 +631,8 @@ public final class TaskEditActivity extends Fragment {
database.openForReading(); database.openForReading();
if(idParam > -1L) { if(idParam > -1L) {
model = taskService.fetchById(idParam, Task.PROPERTIES); model = taskService.fetchById(idParam, Task.PROPERTIES);
model.clearValue(Task.REMOTE_ID); // Having this can screw up autosync if (model != null)
model.clearValue(Task.REMOTE_ID); // Having this can screw up autosync
} }
// not found by id or was never passed an id // not found by id or was never passed an id
@ -716,7 +721,15 @@ public final class TaskEditActivity extends Fragment {
model.putTransitory("task-edit-save", true); //$NON-NLS-1$ model.putTransitory("task-edit-save", true); //$NON-NLS-1$
taskService.save(model); taskService.save(model);
if (!onPause && !cancelFinish) { if (!onPause && !cancelFinish) {
if (!peopleControlSet.isAssignedToMe()) {
Intent data = new Intent();
data.putExtra(TOKEN_TASK_WAS_ASSIGNED, true);
data.putExtra(TOKEN_ASSIGNED_TO, peopleControlSet.getAssignedToString());
getActivity().setResult(Activity.RESULT_OK, data);
}
shouldSaveState = false; shouldSaveState = false;
getActivity().finish(); getActivity().finish();
} }

@ -71,9 +71,11 @@ import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.QueryTemplate; import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.andlib.widget.GestureService; import com.todoroo.andlib.widget.GestureService;
import com.todoroo.andlib.widget.GestureService.GestureInterface; import com.todoroo.andlib.widget.GestureService.GestureInterface;
import com.todoroo.astrid.actfm.ActFmLoginActivity;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.actfm.sync.ActFmSyncProvider; import com.todoroo.astrid.actfm.sync.ActFmSyncProvider;
import com.todoroo.astrid.activity.SortSelectionActivity.OnSortSelectedListener; import com.todoroo.astrid.activity.SortSelectionActivity.OnSortSelectedListener;
@ -88,6 +90,7 @@ import com.todoroo.astrid.api.TaskAction;
import com.todoroo.astrid.api.TaskContextActionExposer; import com.todoroo.astrid.api.TaskContextActionExposer;
import com.todoroo.astrid.api.TaskDecoration; import com.todoroo.astrid.api.TaskDecoration;
import com.todoroo.astrid.core.CoreFilterExposer; import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.CustomFilterExposer;
import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
@ -104,6 +107,7 @@ import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.UpgradeService; import com.todoroo.astrid.service.UpgradeService;
import com.todoroo.astrid.utility.AstridPreferences; import com.todoroo.astrid.utility.AstridPreferences;
@ -179,6 +183,8 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
@Autowired ActFmPreferenceService actFmPreferenceService; @Autowired ActFmPreferenceService actFmPreferenceService;
@Autowired TagDataService tagDataService;
private final TaskContextActionExposer[] contextItemExposers = new TaskContextActionExposer[] { private final TaskContextActionExposer[] contextItemExposers = new TaskContextActionExposer[] {
new ReminderDebugContextActions.MakeNotification(), new ReminderDebugContextActions.MakeNotification(),
new ReminderDebugContextActions.WhenReminder(), new ReminderDebugContextActions.WhenReminder(),
@ -255,7 +261,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// Tell the framework to try to keep this fragment around // Tell the framework to try to keep this fragment around
// during a configuration change. // during a configuration change.
setRetainInstance(true); // setRetainInstance(true);
new StartupService().onStartupApplication(getActivity()); new StartupService().onStartupApplication(getActivity());
@ -355,8 +361,6 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
isFilter = true; isFilter = true;
} else { } else {
filter = CoreFilterExposer.buildInboxFilter(getResources()); filter = CoreFilterExposer.buildInboxFilter(getResources());
// getView().findViewById(R.id.headerLogo).setVisibility(View.VISIBLE);
// getView().findViewById(R.id.listLabel).setVisibility(View.GONE);
isFilter = false; isFilter = false;
} }
@ -434,7 +438,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
} }
} }
private void setUpUiComponents() { protected void setUpUiComponents() {
((ImageView)getView().findViewById(R.id.back)).setOnClickListener(new OnClickListener() { ((ImageView)getView().findViewById(R.id.back)).setOnClickListener(new OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
Preferences.setBoolean(R.string.p_showed_lists_help, true); Preferences.setBoolean(R.string.p_showed_lists_help, true);
@ -442,6 +446,16 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
} }
}); });
getView().findViewById(R.id.sort_settings).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
StatisticsService.reportEvent(StatisticsConstants.TLA_MENU_SORT);
AlertDialog dialog = SortSelectionActivity.createDialog(getActivity(),
TaskListActivity.this, sortFlags, sortSort);
dialog.show();
}
});
// set listener for quick-changing task priority // set listener for quick-changing task priority
getListView().setOnKeyListener(new OnKeyListener() { getListView().setOnKeyListener(new OnKeyListener() {
@Override @Override
@ -482,7 +496,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
*/ */
@Override @Override
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
if(actionId == EditorInfo.IME_NULL && quickAddBox.getText().length() > 0) { if(actionId == EditorInfo.IME_NULL && !TextUtils.isEmpty(quickAddBox.getText().toString().trim())) {
quickAddTask(quickAddBox.getText().toString(), true); quickAddTask(quickAddBox.getText().toString(), true);
return true; return true;
} }
@ -527,6 +541,15 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
} }
}); });
//set listener for astrid icon
((TextView)getView().findViewById(android.R.id.empty)).setOnClickListener( new OnClickListener() {
@Override
public void onClick(View v) {
quickAddButton.performClick();
}
});
// gestures / animation // gestures / animation
try { try {
GestureService.registerGestureDetector(getActivity(), R.id.gestures, R.raw.gestures, this); GestureService.registerGestureDetector(getActivity(), R.id.gestures, R.raw.gestures, this);
@ -610,6 +633,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
StatisticsService.sessionStart(getActivity()); StatisticsService.sessionStart(getActivity());
if (addOnService.hasPowerPack() && if (addOnService.hasPowerPack() &&
Preferences.getBoolean(R.string.p_voiceInputEnabled, true) && Preferences.getBoolean(R.string.p_voiceInputEnabled, true) &&
@ -633,6 +657,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
if (!Preferences.getBoolean(WelcomeLogin.KEY_SHOWED_WELCOME_LOGIN, false)) { if (!Preferences.getBoolean(WelcomeLogin.KEY_SHOWED_WELCOME_LOGIN, false)) {
Intent showWelcomeLogin = new Intent(getActivity(), WelcomeLogin.class); Intent showWelcomeLogin = new Intent(getActivity(), WelcomeLogin.class);
showWelcomeLogin.putExtra(ActFmLoginActivity.SHOW_TOAST, false);
startActivity(showWelcomeLogin); startActivity(showWelcomeLogin);
Preferences.setBoolean(WelcomeLogin.KEY_SHOWED_WELCOME_LOGIN, true); Preferences.setBoolean(WelcomeLogin.KEY_SHOWED_WELCOME_LOGIN, true);
return; return;
@ -782,12 +807,36 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
} }
if(resultCode != Activity.RESULT_CANCELED) { if(resultCode != Activity.RESULT_CANCELED) {
taskAdapter.flushCaches(); if (data != null && data.hasExtra(TaskEditActivity.TOKEN_TASK_WAS_ASSIGNED) && data.getBooleanExtra(TaskEditActivity.TOKEN_TASK_WAS_ASSIGNED, false) && !isFilter) {
loadTaskListContent(true); String assignedTo = data.getStringExtra(TaskEditActivity.TOKEN_ASSIGNED_TO);
taskService.cleanup(); switchToAssignedFilter(assignedTo);
} else {
taskAdapter.flushCaches();
loadTaskListContent(true);
taskService.cleanup();
}
} }
} }
private void switchToAssignedFilter(final String assignedEmail) {
DialogInterface.OnClickListener okListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Filter assignedFilter = CustomFilterExposer.getAssignedByMeFilter(getResources());
Intent intent = new Intent(getActivity(), TaskListWrapperActivity.class);
intent.putExtra(TaskListActivity.TOKEN_FILTER, assignedFilter);
intent.putExtra(TaskListActivity.TOKEN_OVERRIDE_ANIM, true);
startActivityForResult(intent, 0);
transitionForTaskEdit();
}
};
DialogUtilities.okCancelCustomDialog(getActivity(),
getString(R.string.actfm_view_task_title), getString(R.string.actfm_view_task_text, assignedEmail),
R.string.actfm_view_task_ok, R.string.actfm_view_task_cancel, 0,
okListener, null);
}
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) { int totalItemCount) {
// do nothing // do nothing

@ -37,7 +37,7 @@ public class Database extends AbstractDatabase {
* Database version number. This variable must be updated when database * Database version number. This variable must be updated when database
* tables are updated, as it determines whether a database needs updating. * tables are updated, as it determines whether a database needs updating.
*/ */
public static final int VERSION = 17; public static final int VERSION = 18;
/** /**
* Database name (must be unique) * Database name (must be unique)
@ -226,6 +226,12 @@ public class Database extends AbstractDatabase {
} catch (SQLiteException e) { } catch (SQLiteException e) {
Log.e("astrid", "db-upgrade-" + oldVersion + "-" + newVersion, e); Log.e("astrid", "db-upgrade-" + oldVersion + "-" + newVersion, e);
} }
case 17: try {
database.execSQL("ALTER TABLE " + TagData.TABLE.name + " ADD " +
TagData.TAG_DESCRIPTION.accept(visitor, null));
} catch (SQLiteException e) {
Log.e("astrid", "db-upgrade-" + oldVersion + "-" + newVersion, e);
}
return true; return true;
} }

@ -12,7 +12,6 @@ import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
@ -63,13 +62,6 @@ public class TaskDao extends DatabaseDao<Task> {
return Task.DELETION_DATE.neq(0); return Task.DELETION_DATE.neq(0);
} }
/** Check if a given task belongs to someone else & is read-only */
public static Criterion ownedByMe() {
return Criterion.and(Field.field(Task.FLAGS.name+ " & " + //$NON-NLS-1$
Task.FLAG_IS_READONLY).eq(0),
Task.USER_ID.eq(0));
}
/** @return tasks that were not deleted */ /** @return tasks that were not deleted */
public static Criterion notDeleted() { public static Criterion notDeleted() {
return Task.DELETION_DATE.eq(0); return Task.DELETION_DATE.eq(0);
@ -82,16 +74,6 @@ public class TaskDao extends DatabaseDao<Task> {
Task.HIDE_UNTIL.lt(Functions.now())); Task.HIDE_UNTIL.lt(Functions.now()));
} }
/** @return tasks that have not yet been completed or deleted */
public static Criterion activeVisibleMine() {
return Criterion.and(Task.COMPLETION_DATE.eq(0),
Task.DELETION_DATE.eq(0),
Task.HIDE_UNTIL.lt(Functions.now()),
Field.field(Task.FLAGS.name + " & " + //$NON-NLS-1$
Task.FLAG_IS_READONLY).eq(0),
Task.USER_ID.eq(0));
}
/** @return tasks that have not yet been completed or deleted */ /** @return tasks that have not yet been completed or deleted */
public static Criterion isActive() { public static Criterion isActive() {
return Criterion.and(Task.COMPLETION_DATE.eq(0), return Criterion.and(Task.COMPLETION_DATE.eq(0),

@ -24,6 +24,7 @@ import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.activity.Eula; import com.todoroo.astrid.activity.Eula;
import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
@ -39,7 +40,9 @@ import com.todoroo.astrid.utility.AstridPreferences;
public final class UpgradeService { public final class UpgradeService {
public static final int V3_9_1 = 204; public static final int V3_9_1_1 = 206;
public static final int V3_9_1 = 205;
public static final int V3_9_0_2 = 204;
public static final int V3_9_0_1 = 203; public static final int V3_9_0_1 = 203;
public static final int V3_9 = 202; public static final int V3_9 = 202;
public static final int V3_8_5_1 = 201; public static final int V3_8_5_1 = 201;
@ -86,6 +89,8 @@ public final class UpgradeService {
@Autowired AddOnService addOnService; @Autowired AddOnService addOnService;
@Autowired ActFmPreferenceService actFmPreferenceService;
public UpgradeService() { public UpgradeService() {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
} }
@ -109,6 +114,10 @@ public final class UpgradeService {
Preferences.setString(R.string.p_theme, "black"); //$NON-NLS-1$ Preferences.setString(R.string.p_theme, "black"); //$NON-NLS-1$
} }
if( from<= V3_9_1_1) {
actFmPreferenceService.clearLastSyncDate();
}
// long running tasks: pop up a progress dialog // long running tasks: pop up a progress dialog
final ProgressDialog dialog; final ProgressDialog dialog;
if(from < V3_0_0 && context instanceof Activity) if(from < V3_0_0 && context instanceof Activity)
@ -161,8 +170,26 @@ public final class UpgradeService {
Preferences.clear(AstridPreferences.P_UPGRADE_FROM); Preferences.clear(AstridPreferences.P_UPGRADE_FROM);
StringBuilder changeLog = new StringBuilder(); StringBuilder changeLog = new StringBuilder();
if (from >= V3_9 && from < V3_9_1) { if (from >= V3_9_1 && from < V3_9_1_1) {
newVersionString(changeLog, "3.9.1 (12/23/11)", new String[] { newVersionString(changeLog, "3.9.1.1 (01/06/12)", new String[] {
"Fixed a few bugs:",
" Crash when selecting certain lists",
" Some lists not displayed",
" Wrong text color when assigning tasks in Night theme"
});
}
if (from < V3_9_1) {
newVersionString(changeLog, "3.9.1 (01/04/12)", new String[] {
"Improvements to new user experience",
"Bug fixes for task sharing",
"Bug fixes for the time picker",
"Fixes for some common crashes"
});
}
if (from >= V3_9 && from < V3_9_0_2) {
newVersionString(changeLog, "3.9.0.2 (12/23/11)", new String[] {
"UI enhancements, better scrolling performance, and themed task edit dialogs", "UI enhancements, better scrolling performance, and themed task edit dialogs",
"Clickable links in task notes", "Clickable links in task notes",
"Fixed fields that were getting hidden under the keyboard", "Fixed fields that were getting hidden under the keyboard",

@ -137,8 +137,8 @@ public class AstridTimePicker extends LinearLayout {
amButton.setChecked(false); amButton.setChecked(false);
pmButton.setChecked(false); pmButton.setChecked(false);
} else { } else {
hours.updateView(); hours.validateAndUpdate();
minutes.updateView(); minutes.validateAndUpdate();
amButton.setChecked(!lastSelectionWasPm); amButton.setChecked(!lastSelectionWasPm);
pmButton.setChecked(lastSelectionWasPm); pmButton.setChecked(lastSelectionWasPm);
@ -162,6 +162,7 @@ public class AstridTimePicker extends LinearLayout {
if (!is24Hour) { if (!is24Hour) {
if (hour == 0) { if (hour == 0) {
hour = 12; hour = 12;
} else if (hour == 12) {
pm = true; pm = true;
} else if (hour > 12) { } else if (hour > 12) {
hour -= 12; hour -= 12;

@ -283,7 +283,7 @@ public class CalendarView extends View {
// Month text -- Start // Month text -- Start
int monthX = getMeasuredWidth() / 2; int monthX = getMeasuredWidth() / 2;
int monthY = (int) (monthTitleHeight / 2 + 15); int monthY = (int) (monthTitleHeight / 2 + 15);
String monthYear = (String) DateFormat.format("MMMM yyyy", getCoercedDate(calendar.getTime(), calendarDate)); //calendarDate.getTime() == 0 ? calendar.getTime() : calendarDate); //$NON-NLS-1$ String monthYear = (String) DateFormat.format("MMMM yyyy", getCoercedDate(calendar.getTime(), calendarDate)); //$NON-NLS-1$
canvas.drawText(monthYear, monthX, monthY, monthCenterAlignLargePaint); canvas.drawText(monthYear, monthX, monthY, monthCenterAlignLargePaint);
// Month text -- End // Month text -- End
@ -313,7 +313,7 @@ public class CalendarView extends View {
// Day heading -- End // Day heading -- End
// Calendar -- Start // Calendar -- Start
calendar.setTime(getCoercedDate(calendar.getTime(), calendarDate)); //calendarDate.getTime() == 0 ? calendar.getTime() : calendarDate); calendar.setTime(getCoercedDate(calendar.getTime(), calendarDate));
if (currentHighlightDay == -1) { if (currentHighlightDay == -1) {
currentHighlightDay = calendarDate.getTime() == 0 ? 0 : calendar.get(Calendar.DATE); currentHighlightDay = calendarDate.getTime() == 0 ? 0 : calendar.get(Calendar.DATE);
@ -437,7 +437,7 @@ public class CalendarView extends View {
currentHighlightDay = i+1; currentHighlightDay = i+1;
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
Date today = getToday(calendar); Date today = getToday(calendar);
calendar.setTime(getCoercedDate(today, calendarDate)); //calendarDate.getTime() == 0 ? today : calendarDate); calendar.setTime(getCoercedDate(today, calendarDate));
calendar.set(Calendar.DATE, currentHighlightDay); calendar.set(Calendar.DATE, currentHighlightDay);
calendarDate = calendar.getTime(); calendarDate = calendar.getTime();

@ -24,4 +24,8 @@ public class DeadlineNumberPicker extends NumberPicker {
return R.layout.deadline_number_picker; return R.layout.deadline_number_picker;
} }
@Override
protected int getMaxDigits() {
return 2;
}
} }

@ -5,31 +5,43 @@ import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.util.Linkify; import android.text.util.Linkify;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.LinearLayout;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.ui.TextViewWithMeasureListener.OnTextMeasureListener;
public class EditNotesControlSet extends PopupControlSet { public class EditNotesControlSet extends PopupControlSet {
private final EditText editText; private final EditText editText;
private final TextView notesPreview; private final TextViewWithMeasureListener notesPreview;
private final LinearLayout notesBody;
public EditNotesControlSet(Activity activity, int viewLayout, int displayViewLayout) { public EditNotesControlSet(Activity activity, int viewLayout, int displayViewLayout) {
super(activity, viewLayout, displayViewLayout, R.string.TEA_note_label); super(activity, viewLayout, displayViewLayout, R.string.TEA_note_label);
editText = (EditText) getView().findViewById(R.id.notes); editText = (EditText) getView().findViewById(R.id.notes);
notesPreview = (TextView) getDisplayView().findViewById(R.id.notes_display); notesPreview = (TextViewWithMeasureListener) getDisplayView().findViewById(R.id.notes_display);
notesBody = (LinearLayout) getDisplayView().findViewById(R.id.notes_body);
dialog.getWindow() dialog.getWindow()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
notesPreview.setOnTextSizeChangedListener(new OnTextMeasureListener() {
@Override
public void onTextSizeChanged() {
setupGravity();
}
});
} }
@Override @Override
protected void refreshDisplayView() { protected void refreshDisplayView() {
notesPreview.setText(""); notesPreview.setText("");
notesPreview.setText(editText.getText()); notesPreview.setText(editText.getText());
setupGravity();
linkifyDisplayView(); linkifyDisplayView();
} }
@ -71,4 +83,15 @@ public class EditNotesControlSet extends PopupControlSet {
return !TextUtils.isEmpty(editText.getText()); return !TextUtils.isEmpty(editText.getText());
} }
private void setupGravity() {
DisplayMetrics metrics = activity.getResources().getDisplayMetrics();
if (hasNotes() && notesPreview.getLineCount() > 2) {
notesBody.setGravity(Gravity.TOP);
notesBody.setPadding(0, (int) (metrics.density * 8), 0, (int) (metrics.density * 8));
} else {
notesBody.setGravity(Gravity.CENTER_VERTICAL);
notesBody.setPadding(0, 0, 0, 0);
}
}
} }

@ -23,6 +23,7 @@ import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.NumberKeyListener; import android.text.method.NumberKeyListener;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -123,6 +124,14 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
return R.layout.number_picker; return R.layout.number_picker;
} }
/**
* @return The number of allowable digits that can be typed in (-1 for unlimited)
* e.g. return 2 if you don't want to allow 00002 even if 2 is in range.
*/
protected int getMaxDigits() {
return -1;
}
public NumberPicker(Context context, AttributeSet attrs, int defStyle) { public NumberPicker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs); super(context, attrs);
setOrientation(VERTICAL); setOrientation(VERTICAL);
@ -294,12 +303,22 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
} }
} }
private void validateCurrentView(CharSequence str) { public void validateAndUpdate() {
String str = String.valueOf(mText.getText());
if (TextUtils.isEmpty(str)) {
updateView();
} else {
validateCurrentView(str, false);
}
}
private void validateCurrentView(CharSequence str, boolean notifyChange) {
int val = getSelectedPos(str.toString()); int val = getSelectedPos(str.toString());
if ((val >= mStart) && (val <= mEnd)) { if ((val >= mStart) && (val <= mEnd)) {
mPrevious = mCurrent; mPrevious = mCurrent;
mCurrent = val; mCurrent = val;
notifyChange(mCurrent); if (notifyChange)
notifyChange(mCurrent);
} }
updateView(); updateView();
} }
@ -318,7 +337,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
} else { } else {
// Check the new value and ensure it's in range // Check the new value and ensure it's in range
validateCurrentView(str); validateCurrentView(str, true);
} }
} }
} }
@ -404,6 +423,10 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
if ("".equals(result)) { if ("".equals(result)) {
return result; return result;
} }
if (getMaxDigits() > 0 && result.length() > getMaxDigits())
return "";
int val = getSelectedPos(result); int val = getSelectedPos(result);
/* /*
@ -463,7 +486,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
*/ */
public int getCurrent() { public int getCurrent() {
String str = String.valueOf(((TextView) mText).getText()); String str = String.valueOf(((TextView) mText).getText());
validateCurrentView(str); validateCurrentView(str, true);
return mCurrent; return mCurrent;
} }
} }

@ -0,0 +1,35 @@
package com.todoroo.astrid.ui;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
public class TextViewWithMeasureListener extends TextView {
public interface OnTextMeasureListener {
public void onTextSizeChanged();
}
private OnTextMeasureListener listener;
public TextViewWithMeasureListener(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (listener != null) {
listener.onTextSizeChanged();
}
}
public OnTextMeasureListener getOnTextSizeChangedListener() {
return listener;
}
public void setOnTextSizeChangedListener(OnTextMeasureListener listener) {
this.listener = listener;
}
}

@ -33,7 +33,11 @@ public class HelpInfoPopover extends QuickActionWidget {
parent.post(new Runnable() { parent.post(new Runnable() {
@Override @Override
public void run() { public void run() {
toShow.show(parent); try {
toShow.show(parent);
} catch (Exception e) {
//Activity wasn't running or something like that
}
} }
}); });
return toShow; return toShow;

@ -1,2 +0,0 @@
# output files and apk
out.dir=antbuild

@ -1,2 +0,0 @@
# output files and apk
out.dir=antbuild
Loading…
Cancel
Save