merged master into unifiedtabletphone-ui

fixed NotificationActivity to be shown, also for landscape
pull/14/head
Arne Jans 13 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);
}
public Criterion gte(Object value) {
return UnaryCriterion.gte(this, value);
}
public Criterion lt(final Object value) {
return UnaryCriterion.lt(this, value);
}

@ -1,5 +1,6 @@
package com.todoroo.andlib.sql;
import com.todoroo.andlib.data.Property.IntegerProperty;
import com.todoroo.andlib.data.Property.StringProperty;
@ -50,4 +51,8 @@ public final class Functions {
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);
}
public static Criterion gte(Field field, Object value) {
return new UnaryCriterion(field, Operator.gte, value);
}
public static Criterion lt(Field field, Object value) {
return new UnaryCriterion(field, Operator.lt, value);
}

@ -38,6 +38,7 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import com.todoroo.andlib.data.Property;
@ -684,4 +685,16 @@ public class AndroidUtilities {
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(
TABLE, "taskCount");
/** Tag Desription */
public static final StringProperty TAG_DESCRIPTION = new StringProperty(
TABLE, "tagDescription");
/** List of all properties for this model */
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(IS_UNREAD.name, 0);
defaultValues.put(TASK_COUNT.name, 0);
defaultValues.put(TAG_DESCRIPTION.name, "");
}
@Override

@ -251,6 +251,7 @@ public final class Task extends RemoteModel {
defaultValues.put(LAST_SYNC.name, 0);
defaultValues.put(REMOTE_ID.name, 0);
defaultValues.put(USER_ID.name, 0);
defaultValues.put(CREATOR_ID.name, 0);
defaultValues.put(USER.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.service.ContextManager;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Query;
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 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) {
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);
}
@ -97,8 +97,8 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
if(lastSyncDate == 0)
tasks = taskDao.query(Query.select(Task.ID).where(Criterion.none));
else
tasks = taskDao.query(Query.select(Task.ID).where(
Task.MODIFICATION_DATE.gt(lastSyncDate)).orderBy(Order.asc(Task.ID)));
tasks = taskDao.query(Query.select(Task.ID).where(Criterion.and(TaskCriteria.ownedByMe(), Task.MODIFICATION_DATE.gt(lastSyncDate)))
.orderBy(Order.asc(Task.ID)));
tasks = filterLocallyUpdated(tasks, lastSyncDate);
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 kind="src" path="gen"/>
<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 exported="true" kind="lib" path="libs/annotations.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/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="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="lib" path="libs/crittercism_v1_1_3.jar"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

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

@ -65,6 +65,7 @@ import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
@ -101,6 +102,9 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
private TextView errors;
protected boolean noSync = false;
public static final String SHOW_TOAST = "show_toast";
private boolean showToast;
// --- ui initialization
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());
noSync = getIntent().getBooleanExtra(EXTRA_DO_NOT_SYNC, false);
showToast = getIntent().getBooleanExtra(SHOW_TOAST, true);
facebook = new Facebook(APP_ID);
facebookRunner = new AsyncFacebookRunner(facebook);
@ -287,6 +293,7 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
public void onClick(DialogInterface dlg, int which) {
String nameString = isNew.get() ? name.getText().toString()
: null;
AndroidUtilities.hideSoftInputForViews(ActFmLoginActivity.this, name, email, password);
authenticate(email.getText().toString(),
nameString, ActFmInvoker.PROVIDER_PASSWORD,
password.getText().toString());
@ -296,7 +303,12 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
else
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);
}
@ -471,7 +483,7 @@ public class ActFmLoginActivity extends Activity implements AuthListener {
finish();
if (!noSync) {
new ActFmSyncProvider().synchronize(ActFmLoginActivity.this);
new ActFmSyncProvider().synchronize(ActFmLoginActivity.this, showToast);
}
try {

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

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

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

@ -195,8 +195,10 @@ public final class ActFmSyncService {
}
if(failedPushes.size() > 0) {
// Copy into a second queue so we don't end up infinitely retrying in the same loop
Queue<FailedPush> toTry = new LinkedList<FailedPush>(failedPushes);
failedPushes.clear();
Queue<FailedPush> toTry = new LinkedList<FailedPush>();
while (failedPushes.size() > 0) {
toTry.add(failedPushes.remove(0));
}
while(!toTry.isEmpty() && !actFmPreferenceService.isOngoing()) {
FailedPush pushOp = toTry.remove();
switch(pushOp.pushType) {
@ -410,7 +412,8 @@ public final class ActFmSyncService {
*/
public void pushTask(long taskId) {
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) {
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) {
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));
}
if(values.containsKey(TagData.TAG_DESCRIPTION.name)) {
params.add("description"); params.add(tagData.getValue(TagData.TAG_DESCRIPTION));
}
if(values.containsKey(TagData.MEMBERS.name)) {
params.add("members");
try {
@ -991,6 +1000,9 @@ public final class ActFmSyncService {
if(json.has("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")) {
JSONArray members = json.getJSONArray("members");
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.FilterListItem;
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.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
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.TextInputCriterion;
import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao.TaskCriteria;
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.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.activity.FilterListActivity;
import com.todoroo.astrid.api.AstridApiConstants;
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.PermaSql;
import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.StoreObject;
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.tags.TagService;
/**
* 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);
Resources r = context.getResources();
//PendingIntent customFilterIntent = PendingIntent.getActivity(context, 0,
// new Intent(context, CustomFilterActivity.class), 0);
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;
}
@ -109,13 +98,7 @@ public final class CustomFilterExposer extends BroadcastReceiver implements Astr
null);
list[1].listingIcon = ((BitmapDrawable)r.getDrawable(R.drawable.filter_pencil)).getBitmap();
int untaggedLabel = gtasksPreferenceService.isLoggedIn() ?
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();
list[2] = getAssignedByMeFilter(r);
StoreObject savedFilter = new StoreObject();
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
*

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

@ -77,6 +77,15 @@ public class NotificationActivity extends TaskListActivity implements OnTimeSetL
StartupService.bypassInitialization();
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();
}

@ -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 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.putExtra(NotificationActivity.TOKEN_ID, id);
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.TaskCriteria;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao;
import com.todoroo.astrid.utility.Constants;
@ -483,7 +484,7 @@ public final class ReminderService {
private TodorooCursor<Task> getTasksWithReminders(Property<?>... properties) {
return taskDao.query(Query.select(properties).where(Criterion.and(
TaskCriteria.isActive(),
TaskCriteria.ownedByMe(),
TaskApiDao.TaskCriteria.ownedByMe(),
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);
for(int i = 0; i < 7; i++) {
CheckBox checkBox = new CheckBox(activity);
checkBox.setTextColor(activity.getResources().getColor(android.R.color.white));
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
checkBox.setPadding(0, 0, 0, 0);
checkBox.setLayoutParams(lp);
@ -107,7 +106,7 @@ public class RepeatControlSet extends PopupControlSet {
checkBox.setButtonDrawable(R.drawable.btn_check_small);
TextView label = new TextView(activity);
label.setTextAppearance(activity, android.R.style.TextAppearance);
label.setTextAppearance(activity, R.style.TextAppearance_GEN_EditLabel);
label.setLayoutParams(textLp);
label.setTextSize(14);
label.setText(dfs.getShortWeekdays()[dayOfWeek].substring(0, 1));

@ -14,6 +14,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Toast;
@ -128,7 +129,6 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
ArrayList<FilterListItem> list = new ArrayList<FilterListItem>();
// --- untagged
addTags(list);
// transmit filter list
@ -143,12 +143,23 @@ public class TagFilterExposer extends BroadcastReceiver implements AstridFilterE
}
private FilterCategory filterFromTags(Tag[] tags, int name) {
Filter[] filters = new Filter[tags.length];
Resources r = ContextManager.getContext().getResources();
Filter[] filters = new Filter[tags.length + 1];
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++)
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);
return filter;
}

@ -30,6 +30,7 @@ import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao;
import com.todoroo.astrid.data.Update;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TagDataService;
@ -145,7 +146,7 @@ public final class TagService {
return new QueryTemplate().where(Criterion.and(
Criterion.not(Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).where(MetadataCriteria.withKey(KEY)))),
TaskCriteria.isActive(),
TaskCriteria.ownedByMe(),
TaskApiDao.TaskCriteria.ownedByMe(),
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"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/list_selector_background"
android:background="?attr/asContentBackground"
android:padding="4dip"
android:paddingRight="6dip"
android:orientation="horizontal">

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

@ -4,6 +4,9 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:paddingBottom="5dip"
android:orientation="vertical">
<LinearLayout android:id="@+id/repeatContainer"
@ -48,16 +51,21 @@
android:layout_weight="1"
android:layout_marginTop="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"
android:id="@+id/edit_dont_repeat"
android:text="@string/repeat_dont"
android:layout_width="150dip"
android:layout_height="50dip"
android:layout_marginTop="15dip"
android:layout_marginBottom="10dip"
android:layout_height="45dip"
android:layout_marginTop="10dip"
android:layout_marginBottom="5dip"
android:layout_weight="1"
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>

@ -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>

@ -42,23 +42,11 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
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
android:id="@+id/tag_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/picture"
android:layout_alignParentTop="true"
android:layout_marginTop="10dip"
style="@style/TextAppearance.GEN_EditLabel"
@ -68,7 +56,6 @@
android:id="@+id/tag_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/picture"
android:layout_below="@id/tag_label"
android:layout_marginTop="10dip" />
@ -92,8 +79,59 @@
android:orientation="vertical"
android:layout_width="fill_parent"
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 -->
<LinearLayout
android:id="@+id/listSettingsMore"

@ -34,18 +34,6 @@
android:layout_height="fill_parent"
android:layout_weight="1"
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 -->
<TextView android:id="@+id/listLabel"
@ -53,7 +41,6 @@
android:layout_height="fill_parent"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:paddingRight="50dip"
android:layout_weight="100"
android:singleLine="true"
android:ellipsize="end"
@ -79,6 +66,23 @@
android:src="@drawable/icn_cmmt_off"
android:scaleType="fitCenter" />
</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>

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

@ -33,6 +33,18 @@
<!-- filter list activity: refresh tags -->
<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 == -->
@ -78,7 +90,16 @@
<!-- Tag Settings: silence notifications label -->
<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 == -->
<!-- task sharing dialog: intro -->

@ -96,7 +96,7 @@
<!-- ================================================= TaskListActivity == -->
<!-- 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 -->
<string name="TLA_menu_addons">Add-ons</string>

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

@ -42,7 +42,7 @@
<!-- help bubbles -->
<!-- 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 -->
<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);
}
@Override
protected void setUpUiComponents() {
super.setUpUiComponents();
getView().findViewById(R.id.sortContainer).setVisibility(View.GONE);
}
// --- task adapter
/**

@ -161,7 +161,7 @@ public class FilterListActivity extends ExpandableListFragment {
// Tell the framework to try to keep this fragment around
// during a configuration change.
setRetainInstance(true);
// setRetainInstance(true);
new StartupService().onStartupApplication(getActivity());
}
@ -256,7 +256,6 @@ public class FilterListActivity extends ExpandableListFragment {
item = menu.add(Menu.NONE, MENU_NEW_FILTER_ID, Menu.NONE,
R.string.FLA_new_filter);
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,
R.string.FLA_menu_search);
@ -476,8 +475,7 @@ public class FilterListActivity extends ExpandableListFragment {
return true;
}
default: {
TaskListActivity tasklist = (TaskListActivity) getSupportFragmentManager()
.findFragmentById(R.id.tasklist_fragment);
Fragment tasklist = getSupportFragmentManager().findFragmentById(R.id.tasklist_fragment);
if (tasklist != null && tasklist.isInLayout())
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 TOKEN_TASK_WAS_ASSIGNED = "task_assigned"; //$NON-NLS-1$
public static final String TOKEN_ASSIGNED_TO = "task_assigned_to"; //$NON-NLS-1$
// --- services
@Autowired
@ -627,7 +631,8 @@ public final class TaskEditActivity extends Fragment {
database.openForReading();
if(idParam > -1L) {
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
@ -716,7 +721,15 @@ public final class TaskEditActivity extends Fragment {
model.putTransitory("task-edit-save", true); //$NON-NLS-1$
taskService.save(model);
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;
getActivity().finish();
}

@ -71,9 +71,11 @@ import com.todoroo.andlib.sql.Functions;
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.andlib.utility.Preferences;
import com.todoroo.andlib.widget.GestureService;
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.ActFmSyncProvider;
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.TaskDecoration;
import com.todoroo.astrid.core.CoreFilterExposer;
import com.todoroo.astrid.core.CustomFilterExposer;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.Database;
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.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.service.UpgradeService;
import com.todoroo.astrid.utility.AstridPreferences;
@ -179,6 +183,8 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
@Autowired ActFmPreferenceService actFmPreferenceService;
@Autowired TagDataService tagDataService;
private final TaskContextActionExposer[] contextItemExposers = new TaskContextActionExposer[] {
new ReminderDebugContextActions.MakeNotification(),
new ReminderDebugContextActions.WhenReminder(),
@ -255,7 +261,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
super.onCreate(savedInstanceState);
// Tell the framework to try to keep this fragment around
// during a configuration change.
setRetainInstance(true);
// setRetainInstance(true);
new StartupService().onStartupApplication(getActivity());
@ -355,8 +361,6 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
isFilter = true;
} else {
filter = CoreFilterExposer.buildInboxFilter(getResources());
// getView().findViewById(R.id.headerLogo).setVisibility(View.VISIBLE);
// getView().findViewById(R.id.listLabel).setVisibility(View.GONE);
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() {
public void onClick(View v) {
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
getListView().setOnKeyListener(new OnKeyListener() {
@Override
@ -482,7 +496,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
*/
@Override
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);
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
try {
GestureService.registerGestureDetector(getActivity(), R.id.gestures, R.raw.gestures, this);
@ -610,6 +633,7 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
@Override
public void onResume() {
super.onResume();
StatisticsService.sessionStart(getActivity());
if (addOnService.hasPowerPack() &&
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)) {
Intent showWelcomeLogin = new Intent(getActivity(), WelcomeLogin.class);
showWelcomeLogin.putExtra(ActFmLoginActivity.SHOW_TOAST, false);
startActivity(showWelcomeLogin);
Preferences.setBoolean(WelcomeLogin.KEY_SHOWED_WELCOME_LOGIN, true);
return;
@ -782,12 +807,36 @@ public class TaskListActivity extends ListFragment implements OnScrollListener,
}
if(resultCode != Activity.RESULT_CANCELED) {
taskAdapter.flushCaches();
loadTaskListContent(true);
taskService.cleanup();
if (data != null && data.hasExtra(TaskEditActivity.TOKEN_TASK_WAS_ASSIGNED) && data.getBooleanExtra(TaskEditActivity.TOKEN_TASK_WAS_ASSIGNED, false) && !isFilter) {
String assignedTo = data.getStringExtra(TaskEditActivity.TOKEN_ASSIGNED_TO);
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,
int totalItemCount) {
// do nothing

@ -37,7 +37,7 @@ public class Database extends AbstractDatabase {
* Database version number. This variable must be updated when database
* 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)
@ -226,6 +226,12 @@ public class Database extends AbstractDatabase {
} catch (SQLiteException 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;
}

@ -12,7 +12,6 @@ import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
@ -63,13 +62,6 @@ public class TaskDao extends DatabaseDao<Task> {
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 */
public static Criterion notDeleted() {
return Task.DELETION_DATE.eq(0);
@ -82,16 +74,6 @@ public class TaskDao extends DatabaseDao<Task> {
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 */
public static Criterion isActive() {
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.DialogUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.actfm.sync.ActFmPreferenceService;
import com.todoroo.astrid.activity.Eula;
import com.todoroo.astrid.core.SortHelper;
import com.todoroo.astrid.dao.Database;
@ -39,7 +40,9 @@ import com.todoroo.astrid.utility.AstridPreferences;
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 = 202;
public static final int V3_8_5_1 = 201;
@ -86,6 +89,8 @@ public final class UpgradeService {
@Autowired AddOnService addOnService;
@Autowired ActFmPreferenceService actFmPreferenceService;
public UpgradeService() {
DependencyInjectionService.getInstance().inject(this);
}
@ -109,6 +114,10 @@ public final class UpgradeService {
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
final ProgressDialog dialog;
if(from < V3_0_0 && context instanceof Activity)
@ -161,8 +170,26 @@ public final class UpgradeService {
Preferences.clear(AstridPreferences.P_UPGRADE_FROM);
StringBuilder changeLog = new StringBuilder();
if (from >= V3_9 && from < V3_9_1) {
newVersionString(changeLog, "3.9.1 (12/23/11)", new String[] {
if (from >= V3_9_1 && from < V3_9_1_1) {
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",
"Clickable links in task notes",
"Fixed fields that were getting hidden under the keyboard",

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

@ -283,7 +283,7 @@ public class CalendarView extends View {
// Month text -- Start
int monthX = getMeasuredWidth() / 2;
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);
// Month text -- End
@ -313,7 +313,7 @@ public class CalendarView extends View {
// Day heading -- End
// Calendar -- Start
calendar.setTime(getCoercedDate(calendar.getTime(), calendarDate)); //calendarDate.getTime() == 0 ? calendar.getTime() : calendarDate);
calendar.setTime(getCoercedDate(calendar.getTime(), calendarDate));
if (currentHighlightDay == -1) {
currentHighlightDay = calendarDate.getTime() == 0 ? 0 : calendar.get(Calendar.DATE);
@ -437,7 +437,7 @@ public class CalendarView extends View {
currentHighlightDay = i+1;
Calendar calendar = Calendar.getInstance();
Date today = getToday(calendar);
calendar.setTime(getCoercedDate(today, calendarDate)); //calendarDate.getTime() == 0 ? today : calendarDate);
calendar.setTime(getCoercedDate(today, calendarDate));
calendar.set(Calendar.DATE, currentHighlightDay);
calendarDate = calendar.getTime();

@ -24,4 +24,8 @@ public class DeadlineNumberPicker extends NumberPicker {
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.text.TextUtils;
import android.text.util.Linkify;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.LinearLayout;
import com.timsu.astrid.R;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.ui.TextViewWithMeasureListener.OnTextMeasureListener;
public class EditNotesControlSet extends PopupControlSet {
private final EditText editText;
private final TextView notesPreview;
private final TextViewWithMeasureListener notesPreview;
private final LinearLayout notesBody;
public EditNotesControlSet(Activity activity, int viewLayout, int displayViewLayout) {
super(activity, viewLayout, displayViewLayout, R.string.TEA_note_label);
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()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
notesPreview.setOnTextSizeChangedListener(new OnTextMeasureListener() {
@Override
public void onTextSizeChanged() {
setupGravity();
}
});
}
@Override
protected void refreshDisplayView() {
notesPreview.setText("");
notesPreview.setText(editText.getText());
setupGravity();
linkifyDisplayView();
}
@ -71,4 +83,15 @@ public class EditNotesControlSet extends PopupControlSet {
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.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.NumberKeyListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
@ -123,6 +124,14 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
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) {
super(context, attrs);
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());
if ((val >= mStart) && (val <= mEnd)) {
mPrevious = mCurrent;
mCurrent = val;
notifyChange(mCurrent);
if (notifyChange)
notifyChange(mCurrent);
}
updateView();
}
@ -318,7 +337,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
} else {
// 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)) {
return result;
}
if (getMaxDigits() > 0 && result.length() > getMaxDigits())
return "";
int val = getSelectedPos(result);
/*
@ -463,7 +486,7 @@ public class NumberPicker extends LinearLayout implements OnClickListener,
*/
public int getCurrent() {
String str = String.valueOf(((TextView) mText).getText());
validateCurrentView(str);
validateCurrentView(str, true);
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() {
@Override
public void run() {
toShow.show(parent);
try {
toShow.show(parent);
} catch (Exception e) {
//Activity wasn't running or something like that
}
}
});
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