From 5472e0da2c4749b93f44d325bd4cf9fdc49925b9 Mon Sep 17 00:00:00 2001 From: Tim Su Date: Tue, 10 Aug 2010 18:21:11 -0700 Subject: [PATCH] Fixed some bugs, now we actually are able to synchronize producteev workspaces and responsible parties. Todo: edit dashboard / responsible, filters, hide tasks you aren't able to edit --- .../com/todoroo/andlib/data/AbstractDatabase.java | 5 ++++- .../todoroo/andlib/utility/AndroidUtilities.java | 12 ++++++++++++ .../astrid/producteev/ProducteevDetailExposer.java | 4 ++-- .../astrid/producteev/ProducteevLoginActivity.java | 3 +++ .../astrid/producteev/ProducteevPreferences.java | 4 ++-- .../producteev/api/ProducteevRestClient.java | 14 +++++++++++--- .../producteev/sync/ProducteevDataService.java | 9 +++++---- astrid/res/values/strings-producteev.xml | 7 +++++-- astrid/src/com/todoroo/astrid/dao/Database.java | 8 ++++---- .../src/com/todoroo/astrid/utility/Constants.java | 2 +- 10 files changed, 49 insertions(+), 19 deletions(-) diff --git a/astrid/common-src/com/todoroo/andlib/data/AbstractDatabase.java b/astrid/common-src/com/todoroo/andlib/data/AbstractDatabase.java index db5c265c8..b92fd84b0 100644 --- a/astrid/common-src/com/todoroo/andlib/data/AbstractDatabase.java +++ b/astrid/common-src/com/todoroo/andlib/data/AbstractDatabase.java @@ -15,6 +15,7 @@ import android.util.Log; import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.utility.AndroidUtilities; /** * AbstractDatabase is a database abstraction which wraps a SQLite database. @@ -160,8 +161,10 @@ abstract public class AbstractDatabase { * @return sql database. opens database if not yet open */ public synchronized final SQLiteDatabase getDatabase() { - if(database == null) + if(database == null) { + AndroidUtilities.sleepDeep(300L); openForWriting(); + } return database; } diff --git a/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java b/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java index b4956414c..20734b706 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java +++ b/astrid/common-src/com/todoroo/andlib/utility/AndroidUtilities.java @@ -297,4 +297,16 @@ public class AndroidUtilities { } } } + + /** + * Sleep, ignoring interruption + * @param l + */ + public static void sleepDeep(long l) { + try { + Thread.sleep(l); + } catch (InterruptedException e) { + // ignore + } + } } diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevDetailExposer.java index 355e6f483..70f6cd063 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevDetailExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevDetailExposer.java @@ -83,10 +83,10 @@ public class ProducteevDetailExposer extends BroadcastReceiver implements Detail // display responsible user if not current one if(responsibleId > 0 && ownerDashboard != null && responsibleId != Preferences.getLong(ProducteevUtilities.PREF_USER_ID, 0L)) { - String users = ownerDashboard.getValue(ProducteevDashboard.USERS); + String users = ";" + ownerDashboard.getValue(ProducteevDashboard.USERS); //$NON-NLS-1$ int index = users.indexOf(";" + responsibleId + ","); //$NON-NLS-1$ //$NON-NLS-2$ if(index > -1) { - String user = users.substring(users.indexOf(',', index), + String user = users.substring(users.indexOf(',', index) + 1, users.indexOf(';', index + 1)); builder.append(context.getString(R.string.producteev_TLA_responsible, user)).append(TaskAdapter.DETAIL_SEPARATOR); diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevLoginActivity.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevLoginActivity.java index e7a6c7d77..3df78ad4e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevLoginActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevLoginActivity.java @@ -36,6 +36,7 @@ import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.utility.DialogUtilities; +import com.todoroo.astrid.producteev.api.ApiAuthenticationException; import com.todoroo.astrid.producteev.api.ProducteevInvoker; import com.todoroo.astrid.producteev.sync.ProducteevSyncProvider; import com.todoroo.astrid.utility.Preferences; @@ -152,6 +153,8 @@ public class ProducteevLoginActivity extends Activity { ProducteevUtilities.INSTANCE.setToken(invoker.getToken()); synchronize(); + } catch (ApiAuthenticationException e) { + errorMessage.append(getString(R.string.producteev_PLA_errorAuth)); } catch (Exception e) { errorMessage.append(e.getMessage()); } finally { diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevPreferences.java b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevPreferences.java index 81b8e73aa..e8321fd3d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevPreferences.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/ProducteevPreferences.java @@ -51,8 +51,8 @@ public class ProducteevPreferences extends SyncProviderPreferences { ListPreference defaultDash = (ListPreference)findPreference(getString(R.string.producteev_PPr_defaultdash_key)); String[] entries, entryValues; - if(ProducteevUtilities.INSTANCE.isLoggedIn()) { - StoreObject[] dashboards = ProducteevDataService.getInstance().getDashboards(); + StoreObject[] dashboards = ProducteevDataService.getInstance().getDashboards(); + if(ProducteevUtilities.INSTANCE.isLoggedIn() && dashboards.length > 0) { entries = new String[dashboards.length + 1]; entryValues = new String[dashboards.length + 1]; for(int i = 0; i < dashboards.length; i++) { diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevRestClient.java b/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevRestClient.java index a8e4d589e..f4686ac8d 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevRestClient.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/api/ProducteevRestClient.java @@ -18,6 +18,7 @@ import org.apache.http.params.HttpParams; import org.json.JSONObject; import com.todoroo.andlib.service.RestClient; +import com.todoroo.astrid.utility.Constants; /** * RestClient allows Android to consume web requests. @@ -85,6 +86,8 @@ public class ProducteevRestClient implements RestClient { contentStream.close(); } } + if(Constants.DEBUG) + System.err.println(body); int statusCode = response.getStatusLine().getStatusCode(); if(statusCode != HTTP_OK || (body != null && body.startsWith("{\"error\":"))) { //$NON-NLS-1$ @@ -100,7 +103,10 @@ public class ProducteevRestClient implements RestClient { else error = new ApiServiceException(errorMessage); } catch (Exception e) { - error = new ApiServiceException(response.getStatusLine() + + if(statusCode == 401) + error = new ApiAuthenticationException(response.getStatusLine().getReasonPhrase()); + else + error = new ApiServiceException(response.getStatusLine() + "\n" + body); //$NON-NLS-1$ } throw error; @@ -120,7 +126,8 @@ public class ProducteevRestClient implements RestClient { public synchronized String get(String url) throws IOException { initializeHttpClient(); - System.err.println("GET: " + url); //$NON-NLS-1$ // (debug) + if(Constants.DEBUG) + System.err.println("GET: " + url); //$NON-NLS-1$ // (debug) try { HttpGet httpGet = new HttpGet(url); @@ -147,7 +154,8 @@ public class ProducteevRestClient implements RestClient { public synchronized String post(String url, String data) throws IOException { initializeHttpClient(); - System.err.println("POST: " + url); //$NON-NLS-1$ // (debug) + if(Constants.DEBUG) + System.err.println("POST: " + url); //$NON-NLS-1$ // (debug) try { HttpPost httpPost = new HttpPost(url); diff --git a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java index 3665283e9..be037637b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/producteev/sync/ProducteevDataService.java @@ -182,7 +182,7 @@ public final class ProducteevDataService { */ public Metadata getTaskMetadata(long taskId) { TodorooCursor cursor = metadataDao.query(Query.select( - ProducteevTask.ID, ProducteevTask.DASHBOARD_ID).where( + Metadata.PROPERTIES).where( MetadataCriteria.byTaskAndwithKey(taskId, ProducteevTask.METADATA_KEY))); try { if(cursor.getCount() == 0) @@ -270,9 +270,10 @@ public final class ProducteevDataService { JSONArray accessList = remote.getJSONArray("accesslist"); for(int j = 0; j < accessList.length(); j++) { JSONObject user = accessList.getJSONObject(j).getJSONObject("user"); - users.append(user.getLong("id_user")).append(','). - append(user.getString("firstName")).append(' '). - append(user.getString("lastName")).append(';'); + users.append(user.getLong("id_user")).append(','); + String name = user.optString("firstname", "") + ' ' + + user.optString("lastname", ""); + users.append(name.trim()).append(';'); } local.setValue(ProducteevDashboard.USERS, users.toString()); storeObjectDao.persist(local); diff --git a/astrid/res/values/strings-producteev.xml b/astrid/res/values/strings-producteev.xml index 7554f104a..759ace766 100644 --- a/astrid/res/values/strings-producteev.xml +++ b/astrid/res/values/strings-producteev.xml @@ -5,10 +5,10 @@ - Workspace: %s + W: %s - Responsible: %s + R: %s @@ -69,6 +69,9 @@ Error: passwords don\'t match! + + Error: e-mail or password incorrect! + diff --git a/astrid/src/com/todoroo/astrid/dao/Database.java b/astrid/src/com/todoroo/astrid/dao/Database.java index ca057cb39..6bef32257 100644 --- a/astrid/src/com/todoroo/astrid/dao/Database.java +++ b/astrid/src/com/todoroo/astrid/dao/Database.java @@ -77,8 +77,8 @@ public class Database extends AbstractDatabase { sql.append("CREATE INDEX IF NOT EXISTS so_id ON "). append(StoreObject.TABLE).append('('). - append(StoreObject.TYPE).append(','). - append(StoreObject.ITEM). + append(StoreObject.TYPE.name).append(','). + append(StoreObject.ITEM.name). append(')'); database.execSQL(sql.toString()); sql.setLength(0); @@ -114,8 +114,8 @@ public class Database extends AbstractDatabase { sql.append("CREATE INDEX IF NOT EXISTS so_id ON "). append(StoreObject.TABLE).append('('). - append(StoreObject.TYPE).append(','). - append(StoreObject.ITEM). + append(StoreObject.TYPE.name).append(','). + append(StoreObject.ITEM.name). append(')'); database.execSQL(sql.toString()); } diff --git a/astrid/src/com/todoroo/astrid/utility/Constants.java b/astrid/src/com/todoroo/astrid/utility/Constants.java index e700e0eaa..bd463e64f 100644 --- a/astrid/src/com/todoroo/astrid/utility/Constants.java +++ b/astrid/src/com/todoroo/astrid/utility/Constants.java @@ -35,7 +35,7 @@ public final class Constants { /** * Whether to turn on debugging logging and UI */ - public static final boolean DEBUG = false; + public static final boolean DEBUG = true; /** * Upgrade time