diff --git a/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java b/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java index d2b9cd8ad..f4e7ad211 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/CustomFilterActivity.java @@ -351,7 +351,6 @@ public class CustomFilterActivity extends ListActivity { values.put(entry.getKey().replace("?", entryValue), entry.getValue().toString().replace("?", entryValue)); } - values.putAll(instance.criterion.valuesForNewTasks); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java index 6f70eced1..5c8389499 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevControlSet.java @@ -3,6 +3,7 @@ package com.todoroo.astrid.producteev; import java.util.ArrayList; import android.app.Activity; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -61,82 +62,88 @@ public class ProducteevControlSet implements TaskEditControlSet { public void readFromTask(Task task) { this.myTask = task; Metadata metadata = ProducteevDataService.getInstance().getTaskMetadata(myTask.getId()); - if (metadata != null) { - // Fill the dashboard-spinner and set the current dashboard - long dashboardId = metadata.getValue(ProducteevTask.DASHBOARD_ID); - - StoreObject[] dashboardsData = ProducteevDataService.getInstance().getDashboards(); - dashboards = new ArrayList(dashboardsData.length); - ProducteevDashboard ownerDashboard = null; - int dashboardSpinnerIndex = 0; - //dashboard to not sync as first spinner-entry - dashboards.add(new ProducteevDashboard(ProducteevUtilities.DASHBOARD_NO_SYNC, activity.getString(R.string.producteev_no_dashboard),null)); - for (int i=1;i(dashboardsData.length); + ProducteevDashboard ownerDashboard = null; + int dashboardSpinnerIndex = 0; + + //dashboard to not sync as first spinner-entry + dashboards.add(new ProducteevDashboard(ProducteevUtilities.DASHBOARD_NO_SYNC, activity.getString(R.string.producteev_no_dashboard),null)); + for (int i=1;i dashAdapter = new ArrayAdapter(activity, - android.R.layout.simple_spinner_item, dashboards); - dashAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - dashboardSelector.setAdapter(dashAdapter); - dashboardSelector.setSelection(dashboardSpinnerIndex); - - if (ownerDashboard == null || ownerDashboard.getId() == ProducteevUtilities.DASHBOARD_NO_SYNC) { - responsibleSelector.setEnabled(false); - TextView emptyView = new TextView(activity); - emptyView.setText(activity.getText(R.string.producteev_no_dashboard)); - responsibleSelector.setEmptyView(emptyView); - view.findViewById(R.id.producteev_TEA_task_assign_label).setVisibility(View.GONE); - return; - } + ArrayAdapter dashAdapter = new ArrayAdapter(activity, + android.R.layout.simple_spinner_item, dashboards); + dashAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + dashboardSelector.setAdapter(dashAdapter); + dashboardSelector.setSelection(dashboardSpinnerIndex); + + if (ownerDashboard == null || ownerDashboard.getId() == ProducteevUtilities.DASHBOARD_NO_SYNC) { + responsibleSelector.setEnabled(false); + TextView emptyView = new TextView(activity); + emptyView.setText(activity.getText(R.string.producteev_no_dashboard)); + responsibleSelector.setEmptyView(emptyView); + view.findViewById(R.id.producteev_TEA_task_assign_label).setVisibility(View.GONE); + return; + } - // Fill the responsible-spinner and set the current responsible - users = ownerDashboard.getUsers(); - long responsibleId = metadata.getValue(ProducteevTask.RESPONSIBLE_ID); - int userSpinnerIndex = 0; + // Fill the responsible-spinner and set the current responsible + users = ownerDashboard.getUsers(); + long responsibleId = metadata.getValue(ProducteevTask.RESPONSIBLE_ID); + int userSpinnerIndex = 0; - for (ProducteevUser user : users) { - if (user.getId() == responsibleId) { - break; - } - userSpinnerIndex++; + for (ProducteevUser user : users) { + if (user.getId() == responsibleId) { + break; } - ArrayAdapter usersAdapter = new ArrayAdapter(activity, - android.R.layout.simple_spinner_item, users); - usersAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - responsibleSelector.setAdapter(usersAdapter); - responsibleSelector.setSelection(userSpinnerIndex); + userSpinnerIndex++; } + ArrayAdapter usersAdapter = new ArrayAdapter(activity, + android.R.layout.simple_spinner_item, users); + usersAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + responsibleSelector.setAdapter(usersAdapter); + responsibleSelector.setSelection(userSpinnerIndex); } @Override public void writeToModel(Task task) { Metadata metadata = ProducteevDataService.getInstance().getTaskMetadata(task.getId()); - if (metadata == null) { - metadata = new Metadata(); - metadata.setValue(Metadata.KEY, ProducteevTask.METADATA_KEY); - metadata.setValue(Metadata.TASK, task.getId()); - metadata.setValue(ProducteevTask.ID, 0L); - } + try { + if (metadata == null) { + metadata = new Metadata(); + metadata.setValue(Metadata.KEY, ProducteevTask.METADATA_KEY); + metadata.setValue(Metadata.TASK, task.getId()); + metadata.setValue(ProducteevTask.ID, 0L); + } - ProducteevDashboard dashboard = (ProducteevDashboard) dashboardSelector.getSelectedItem(); - metadata.setValue(ProducteevTask.DASHBOARD_ID, dashboard.getId()); + ProducteevDashboard dashboard = (ProducteevDashboard) dashboardSelector.getSelectedItem(); + metadata.setValue(ProducteevTask.DASHBOARD_ID, dashboard.getId()); - ProducteevUser responsibleUser = (ProducteevUser) responsibleSelector.getSelectedItem(); + ProducteevUser responsibleUser = (ProducteevUser) responsibleSelector.getSelectedItem(); - if(responsibleUser == null) - metadata.setValue(ProducteevTask.RESPONSIBLE_ID, 0L); - else - metadata.setValue(ProducteevTask.RESPONSIBLE_ID, responsibleUser.getId()); + if(responsibleUser == null) + metadata.setValue(ProducteevTask.RESPONSIBLE_ID, 0L); + else + metadata.setValue(ProducteevTask.RESPONSIBLE_ID, responsibleUser.getId()); - if(metadata.getSetValues().size() > 0 ) { - metadataService.save(metadata); - task.setValue(Task.MODIFICATION_DATE, DateUtilities.now()); + if(metadata.getSetValues().size() > 0 ) { + metadataService.save(metadata); + task.setValue(Task.MODIFICATION_DATE, DateUtilities.now()); + } + } catch (Exception e) { + Log.e("error-saving-pdv", "Error Saving Metadata", e); //$NON-NLS-1$ //$NON-NLS-2$ } } } \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevTask.java b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevTask.java index 525fc5e8a..5e361b2e4 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevTask.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevTask.java @@ -2,6 +2,8 @@ package com.todoroo.astrid.producteev.sync; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.astrid.model.Metadata; +import com.todoroo.astrid.producteev.ProducteevUtilities; +import com.todoroo.astrid.utility.Preferences; /** * Metadata entries for a Producteev Task @@ -29,4 +31,14 @@ public class ProducteevTask { public static final LongProperty RESPONSIBLE_ID = new LongProperty(Metadata.TABLE, Metadata.VALUE4.name); + public static Metadata newMetadata() { + Metadata metadata = new Metadata(); + metadata.setValue(Metadata.KEY, ProducteevTask.METADATA_KEY); + metadata.setValue(ID, 0L); + metadata.setValue(DASHBOARD_ID, ProducteevUtilities.INSTANCE.getDefaultDashboard()); + metadata.setValue(CREATOR_ID, Preferences.getLong(ProducteevUtilities.PREF_USER_ID, 0L)); + metadata.setValue(RESPONSIBLE_ID, Preferences.getLong(ProducteevUtilities.PREF_USER_ID, 0L)); + return metadata; + } + } diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevTaskContainer.java b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevTaskContainer.java index 12f15af68..ea6bef009 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevTaskContainer.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevTaskContainer.java @@ -24,8 +24,7 @@ public class ProducteevTaskContainer extends TaskContainer { this.metadata = metadata; this.pdvTask = pdvTask; if(this.pdvTask == null) { - this.pdvTask = new Metadata(); - this.pdvTask.setValue(Metadata.KEY, ProducteevTask.METADATA_KEY); + this.pdvTask = ProducteevTask.newMetadata(); } } @@ -52,8 +51,7 @@ public class ProducteevTaskContainer extends TaskContainer { } } if(this.pdvTask == null) { - this.pdvTask = new Metadata(); - this.pdvTask.setValue(Metadata.KEY, ProducteevTask.METADATA_KEY); + this.pdvTask = ProducteevTask.newMetadata(); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java index 6b699168f..1c0bb5ec9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/TagsControlSet.java @@ -13,6 +13,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.timsu.astrid.R; +import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.utility.DateUtilities; @@ -47,18 +48,21 @@ public final class TagsControlSet implements TaskEditControlSet { public void readFromTask(Task task) { tagsContainer.removeAllViews(); - TodorooCursor cursor = tagService.getTags(task.getId()); - try { - loadedTags = new String[cursor.getCount()]; - for(int i = 0; i < loadedTags.length; i++) { - cursor.moveToNext(); - String tag = cursor.get(TagService.TAG); - addTag(tag); - loadedTags[i] = tag; + if(task.getId() != AbstractModel.NO_ID) { + TodorooCursor cursor = tagService.getTags(task.getId()); + try { + loadedTags = new String[cursor.getCount()]; + for(int i = 0; i < loadedTags.length; i++) { + cursor.moveToNext(); + String tag = cursor.get(TagService.TAG); + addTag(tag); + loadedTags[i] = tag; + } + } finally { + cursor.close(); } - } finally { - cursor.close(); } + if(tagsContainer.getChildCount() == 0) addTag(""); //$NON-NLS-1$ } diff --git a/astrid/res/layout/widget_initialized.xml b/astrid/res/layout/widget_initialized.xml index ea3b0d664..b4f26033b 100644 --- a/astrid/res/layout/widget_initialized.xml +++ b/astrid/res/layout/widget_initialized.xml @@ -15,9 +15,9 @@ diff --git a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java index 2c69fde2d..8cbf42320 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskEditActivity.java @@ -30,6 +30,7 @@ import android.app.DatePickerDialog; import android.app.DatePickerDialog.OnDateSetListener; import android.app.TabActivity; import android.content.BroadcastReceiver; +import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; @@ -78,6 +79,7 @@ import com.todoroo.astrid.producteev.ProducteevControlSet; import com.todoroo.astrid.producteev.ProducteevUtilities; import com.todoroo.astrid.repeats.RepeatControlSet; import com.todoroo.astrid.service.AddOnService; +import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.StartupService; import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.tags.TagsControlSet; @@ -101,7 +103,12 @@ public final class TaskEditActivity extends TabActivity { /** * Task ID */ - public static final String ID_TOKEN = "i"; //$NON-NLS-1$ + public static final String TOKEN_ID = "i"; //$NON-NLS-1$ + + /** + * Content Values to set + */ + public static final String TOKEN_VALUES = "v"; //$NON-NLS-1$ // --- request codes @@ -131,6 +138,9 @@ public final class TaskEditActivity extends TabActivity { @Autowired private TaskService taskService; + @Autowired + private MetadataService metadataService; + @Autowired private DateUtilities dateUtilities; @@ -299,7 +309,7 @@ public final class TaskEditActivity extends TabActivity { */ @SuppressWarnings("nls") protected void loadItem(Intent intent) { - long idParam = intent.getLongExtra(ID_TOKEN, -1L); + long idParam = intent.getLongExtra(TOKEN_ID, -1L); database.openForReading(); if(idParam > -1L) { @@ -308,8 +318,11 @@ public final class TaskEditActivity extends TabActivity { // not found by id or was never passed an id if(model == null) { - model = new Task(); - taskService.save(model, false); + String valuesAsString = intent.getStringExtra(TOKEN_VALUES); + ContentValues values = null; + if(valuesAsString != null) + values = AndroidUtilities.contentValuesFromSerializedString(valuesAsString); + model = TaskListActivity.createWithValues(values, taskService, metadataService); } if(model.getValue(Task.TITLE).length() == 0) FlurryAgent.onEvent("create-task"); diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java index 931bbad3d..1603897e8 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListActivity.java @@ -48,13 +48,13 @@ import android.widget.Toast; import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; +import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.utility.AndroidUtilities; -import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.Pair; import com.todoroo.andlib.widget.GestureService; @@ -64,6 +64,7 @@ import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter.ViewHolder; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.TaskAction; import com.todoroo.astrid.api.TaskDecoration; import com.todoroo.astrid.backup.BackupActivity; @@ -350,7 +351,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener, public void onClick(View v) { Task task = quickAddTask(quickAddBox.getText().toString(), false); Intent intent = new Intent(TaskListActivity.this, TaskEditActivity.class); - intent.putExtra(TaskEditActivity.ID_TOKEN, task.getId()); + intent.putExtra(TaskEditActivity.TOKEN_ID, task.getId()); startActivityForResult(intent, ACTIVITY_EDIT_TASK); } }); @@ -629,29 +630,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener, @SuppressWarnings("nls") protected Task quickAddTask(String title, boolean selectNewTask) { try { - Task task = new Task(); + Task task = createWithValues(filter.valuesForNewTasks, + taskService, metadataService); task.setValue(Task.TITLE, title.trim()); - ContentValues forMetadata = null; - if(filter.valuesForNewTasks != null && filter.valuesForNewTasks.size() > 0) { - ContentValues forTask = new ContentValues(); - forMetadata = new ContentValues(); - for(Entry item : filter.valuesForNewTasks.valueSet()) { - if(Long.valueOf(Filter.VALUE_NOW).equals(item.getValue())) - item.setValue(DateUtilities.now()); - if(item.getKey().startsWith(Task.TABLE.name)) - AndroidUtilities.putInto(forTask, item.getKey(), item.getValue()); - else - AndroidUtilities.putInto(forMetadata, item.getKey(), item.getValue()); - } - task.mergeWith(forTask); - } - taskService.save(task, false); - if(forMetadata != null && forMetadata.size() > 0) { - Metadata metadata = new Metadata(); - metadata.setValue(Metadata.TASK, task.getId()); - metadata.mergeWith(forMetadata); - metadataService.save(metadata); - } TextView quickAdd = (TextView)findViewById(R.id.quickAddText); quickAdd.setText(""); //$NON-NLS-1$ @@ -668,6 +649,46 @@ public class TaskListActivity extends ListActivity implements OnScrollListener, } } + /** + * Create task from the given content values, saving it. + * @param values + * @param taskService + * @param metadataService + * @return + */ + public static Task createWithValues(ContentValues values, TaskService taskService, + MetadataService metadataService) { + Task task = new Task(); + ContentValues forMetadata = null; + if(values != null && values.size() > 0) { + ContentValues forTask = new ContentValues(); + forMetadata = new ContentValues(); + outer: for(Entry item : values.valueSet()) { + String key = item.getKey(); + Object value = item.getValue(); + if(value instanceof String) + value = PermaSql.replacePlaceholders((String)value); + + for(Property property : Metadata.PROPERTIES) + if(property.name.equals(key)) { + AndroidUtilities.putInto(forMetadata, key, value); + continue outer; + } + + AndroidUtilities.putInto(forTask, key, value); + } + task.mergeWith(forTask); + } + taskService.save(task, false); + if(forMetadata != null && forMetadata.size() > 0) { + Metadata metadata = new Metadata(); + metadata.setValue(Metadata.TASK, task.getId()); + metadata.mergeWith(forMetadata); + metadataService.save(metadata); + } + return task; + } + protected Pair[] contextMenuItemCache = null; protected void loadContextMenuIntents() { @@ -784,7 +805,7 @@ public class TaskListActivity extends ListActivity implements OnScrollListener, case CONTEXT_MENU_EDIT_TASK_ID: { itemId = item.getGroupId(); intent = new Intent(TaskListActivity.this, TaskEditActivity.class); - intent.putExtra(TaskEditActivity.ID_TOKEN, itemId); + intent.putExtra(TaskEditActivity.TOKEN_ID, itemId); startActivityForResult(intent, ACTIVITY_EDIT_TASK); return true; } diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 3b77f959c..1455605f2 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -556,7 +556,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable { @Override public void onClick(View arg0) { Intent intent = new Intent(activity, TaskEditActivity.class); - intent.putExtra(TaskEditActivity.ID_TOKEN, taskId); + intent.putExtra(TaskEditActivity.TOKEN_ID, taskId); activity.startActivity(intent); } }); diff --git a/astrid/src/com/todoroo/astrid/widget/TasksWidget.java b/astrid/src/com/todoroo/astrid/widget/TasksWidget.java index b3399344c..f74ae2dc7 100644 --- a/astrid/src/com/todoroo/astrid/widget/TasksWidget.java +++ b/astrid/src/com/todoroo/astrid/widget/TasksWidget.java @@ -129,14 +129,10 @@ public class TasksWidget extends AppWidgetProvider { int[] separatorIDs = SEPARATOR_IDS; int numberOfTasks = 5; - Intent listIntent = new Intent(context, TaskListActivity.class); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, - listIntent, 0); - views.setOnClickPendingIntent(R.id.taskbody, pendingIntent); - TodorooCursor cursor = null; + Filter filter = null; try { - Filter filter = getFilter(widgetId); + filter = getFilter(widgetId); views.setTextViewText(R.id.widget_title, filter.title); int flags = Preferences.getInt(SortSelectionActivity.PREF_SORT_FLAGS, 0); @@ -178,7 +174,21 @@ public class TasksWidget extends AppWidgetProvider { cursor.close(); } + Intent listIntent = new Intent(context, TaskListActivity.class); + if(filter != null) { + listIntent.putExtra(TaskListActivity.TOKEN_FILTER, filter); + listIntent.setType(filter.sqlQuery); + } + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, + listIntent, 0); + views.setOnClickPendingIntent(R.id.taskbody, pendingIntent); + Intent editIntent = new Intent(context, TaskEditActivity.class); + if(filter != null && filter.valuesForNewTasks != null) { + String values = AndroidUtilities.contentValuesToSerializedString(filter.valuesForNewTasks); + editIntent.putExtra(TaskEditActivity.TOKEN_VALUES, values); + editIntent.setType(values); + } pendingIntent = PendingIntent.getActivity(context, 0, editIntent, 0); views.setOnClickPendingIntent(R.id.widget_button, pendingIntent); diff --git a/astrid/src/com/todoroo/astrid/widget/WidgetConfigActivity.java b/astrid/src/com/todoroo/astrid/widget/WidgetConfigActivity.java index 621579c39..9fce15efb 100644 --- a/astrid/src/com/todoroo/astrid/widget/WidgetConfigActivity.java +++ b/astrid/src/com/todoroo/astrid/widget/WidgetConfigActivity.java @@ -51,7 +51,7 @@ public class WidgetConfigActivity extends ExpandableListActivity { // set up ui adapter = new FilterAdapter(this, getExpandableListView(), - R.layout.filter_adapter_row, false); + R.layout.filter_adapter_row, true); setListAdapter(adapter); Button button = (Button)findViewById(R.id.ok);