done reading/display-side of producteev-dashboard in the TaskDetailExposer

at least the reading/displaying part is ready for testing, the part where dashboard-infos are written into metadata-db
and dataservice-cache is missing and should be done by tim, i think.
pull/14/head
Arne Jans 14 years ago committed by Tim Su
parent 1b5a1f9d79
commit 78e6107ce0

@ -7,6 +7,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.api.AstridApiConstants;
@ -14,6 +15,7 @@ import com.todoroo.astrid.api.DetailExposer;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.producteev.sync.ProducteevDataService;
import com.todoroo.astrid.producteev.sync.ProducteevNote;
import com.todoroo.astrid.producteev.sync.ProducteevTask;
/**
* Exposes Task Details for Producteev:
@ -49,14 +51,27 @@ public class ProducteevDetailExposer extends BroadcastReceiver implements Detail
@Override
public String getTaskDetails(Context context, long id, boolean extended) {
if(!extended)
Metadata metadata = ProducteevDataService.getInstance().getTaskMetadata(id);
if(metadata == null)
return null;
StringBuilder builder = new StringBuilder();
if(!extended) {
long dashboardId = metadata.getValue(ProducteevTask.DASHBOARD_ID);
String dashboardName = ProducteevDataService.getInstance().getDashboardName(dashboardId);
// Prod dashboard is out of date. don't display Producteev stuff
if(dashboardName == null)
return null;
if(dashboardId > 0) {
builder.append(context.getString(R.string.producteev_TLA_dashboard,
dashboardId)).append(TaskAdapter.DETAIL_SEPARATOR);
}
} else {
TodorooCursor<Metadata> notesCursor = ProducteevDataService.getInstance().getTaskNotesCursor(id);
try {
Metadata metadata = new Metadata();
for(notesCursor.moveToFirst(); !notesCursor.isAfterLast(); notesCursor.moveToNext()) {
metadata.readFromCursor(notesCursor);
builder.append(metadata.getValue(ProducteevNote.MESSAGE)).append(TaskAdapter.DETAIL_SEPARATOR);
@ -64,6 +79,7 @@ public class ProducteevDetailExposer extends BroadcastReceiver implements Detail
} finally {
notesCursor.close();
}
}
if(builder.length() == 0)
return null;

@ -0,0 +1,86 @@
/**
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.producteev.sync;
import android.content.ContentValues;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.astrid.model.Task;
/**
* Data Model which represents a dashboard in Producteev
*
* @author Tim Su <tim@todoroo.com>
*
*/
@SuppressWarnings("nls")
public class ProducteevDashboard extends AbstractModel {
// --- table
public static final Table TABLE = new Table("dashboards", ProducteevDashboard.class);
// --- properties
/** ID (corresponds to RTM ID) */
public static final LongProperty ID = new LongProperty(
TABLE, ID_PROPERTY_NAME);
/** Name */
public static final StringProperty NAME = new StringProperty(
TABLE, "name");
/** List of all properties for this model */
public static final Property<?>[] PROPERTIES = generateProperties(ProducteevDashboard.class);
// --- defaults
/** Default values container */
private static final ContentValues defaultValues = new ContentValues();
// static {
// defaultValues.put(POSITION.name, 0);
// defaultValues.put(ARCHIVED.name, 0);
// }
@Override
public ContentValues getDefaultValues() {
return defaultValues;
}
// --- data access boilerplate
public ProducteevDashboard() {
super();
}
public ProducteevDashboard(TodorooCursor<ProducteevDashboard> cursor) {
this();
readPropertiesFromCursor(cursor);
}
public void readFromCursor(TodorooCursor<ProducteevDashboard> cursor) {
super.readPropertiesFromCursor(cursor);
}
@Override
public long getId() {
return getIdHelper(ID);
};
// --- parcelable helpers
private static final Creator<Task> CREATOR = new ModelCreator<Task>(Task.class);
@Override
protected Creator<? extends AbstractModel> getCreator() {
return CREATOR;
}
}

@ -4,10 +4,13 @@
package com.todoroo.astrid.producteev.sync;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.Random;
import android.content.Context;
import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
@ -16,9 +19,10 @@ import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.SoftHashMap;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.model.Metadata;
import com.todoroo.astrid.model.Task;
@ -47,6 +51,10 @@ public final class ProducteevDataService {
protected final Context context;
private final ProducteevDatabase prodDatabase = new ProducteevDatabase();
private final GenericDao<ProducteevDashboard> prodDashboardDao;
@Autowired
private TaskDao taskDao;
@ -60,6 +68,7 @@ public final class ProducteevDataService {
private ProducteevDataService(Context context) {
this.context = context;
DependencyInjectionService.getInstance().inject(this);
prodDashboardDao = new GenericDao<ProducteevDashboard>(ProducteevDashboard.class, prodDatabase);
}
// --- task and metadata methods
@ -153,6 +162,7 @@ public final class ProducteevDataService {
where(Criterion.and(MetadataCriteria.byTask(task.getId()),
Criterion.or(MetadataCriteria.withKey(TagService.KEY),
MetadataCriteria.withKey(ProducteevTask.METADATA_KEY),
// FIXME: Constant from other plugin shouldnt be used
MetadataCriteria.withKey(MilkNote.METADATA_KEY),
MetadataCriteria.withKey(ProducteevNote.METADATA_KEY)))));
try {
@ -193,4 +203,33 @@ public final class ProducteevDataService {
return cursor;
}
// --- list methods
private final Map<Long, String> dashboardCache =
Collections.synchronizedMap(new SoftHashMap<Long, String>());
/**
* Get dashboard name by dashboard id
* @param dashboardId
* @return null if no dashboard by this id exists, otherwise dashboard name
*/
public String getDashboardName(long dashboardId) {
if(dashboardCache.containsKey(dashboardId))
return dashboardCache.get(dashboardId);
TodorooCursor<ProducteevDashboard> cursor = prodDashboardDao.query(Query.select(
ProducteevDashboard.NAME).where(ProducteevDashboard.ID.eq(dashboardId)));
try {
if(cursor.getCount() == 0) {
dashboardCache.put(dashboardId, null);
return null;
}
cursor.moveToFirst();
String name = cursor.get(ProducteevDashboard.NAME);
dashboardCache.put(dashboardId, name);
return name;
} finally {
cursor.close();
}
}
}

@ -0,0 +1,76 @@
/*
* Copyright (c) 2009, Todoroo Inc
* All Rights Reserved
* http://www.todoroo.com
*/
package com.todoroo.astrid.producteev.sync;
import com.todoroo.andlib.data.AbstractDatabase;
import com.todoroo.andlib.data.GenericDao;
import com.todoroo.andlib.data.Table;
/**
* Database wrapper
*
* @author Tim Su <tim@todoroo.com>
*
*/
@SuppressWarnings("nls")
public class ProducteevDatabase extends AbstractDatabase {
// --- constants
/**
* 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 = 1;
/**
* Database name (must be unique)
*/
private static final String NAME = "producteev";
/**
* List of table/ If you're adding a new table, add it to this list and
* also make sure that our SQLite helper does the right thing.
*/
public static final Table[] TABLES = new Table[] {
ProducteevDashboard.TABLE,
};
// --- implementation
private final GenericDao<ProducteevDashboard> dao = new GenericDao<ProducteevDashboard>(ProducteevDashboard.class, this);
@Override
protected String getName() {
return NAME;
}
@Override
protected int getVersion() {
return VERSION;
}
@Override
public Table[] getTables() {
return TABLES;
}
public GenericDao<ProducteevDashboard> getDao() {
return dao;
}
@Override
protected void onCreateTables() {
// do nothing
}
@Override
protected boolean onUpgrade(int oldVersion, int newVersion) {
return false;
}
}

@ -119,7 +119,7 @@ public class ProducteevSyncProvider extends SyncProvider<ProducteevTaskContainer
exceptionService.reportError(tag + "-ioexception", e); //$NON-NLS-1$
if(showError) {
Context context = ContextManager.getContext();
showError(context, e, context.getString(R.string.rmilk_ioerror));
showError(context, e, context.getString(R.string.producteev_ioerror));
}
} else {
exceptionService.reportError(tag + "-unhandled", e); //$NON-NLS-1$

@ -4,7 +4,7 @@ import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.astrid.model.Metadata;
/**
* Metadata entries for a Remember The Milk Task
* Metadata entries for a Producteev Task
* @author Tim Su <tim@todoroo.com>
*
*/

@ -2,6 +2,11 @@
<!-- See the file "LICENSE" for the full license governing this code. -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ====================== Plugin Boilerplate ========================= -->
<!-- task detail showing Producteev dashboard information -->
<string name="producteev_TLA_dashboard">Producteev dashboard: %s</string>
<!-- ==================================================== Preferences == -->
<!-- Preferences Title: Producteev -->

Loading…
Cancel
Save