diff --git a/api/src/com/todoroo/andlib/utility/AndroidUtilities.java b/api/src/com/todoroo/andlib/utility/AndroidUtilities.java index d2fa6a04a..1086fa4f6 100644 --- a/api/src/com/todoroo/andlib/utility/AndroidUtilities.java +++ b/api/src/com/todoroo/andlib/utility/AndroidUtilities.java @@ -7,6 +7,7 @@ package com.todoroo.andlib.utility; import java.io.BufferedInputStream; import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -47,6 +48,7 @@ import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.os.Bundle; import android.text.InputType; +import android.util.Base64; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; @@ -139,6 +141,18 @@ public class AndroidUtilities { return bitmap; } + public static String encodeBase64Bitmap(Bitmap bitmap) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); + byte[] bytes = baos.toByteArray(); + return Base64.encodeToString(bytes, Base64.DEFAULT); + } + + public static Bitmap decodeBase64Bitmap(String encoded) { + byte[] decodedByte = Base64.decode(encoded, 0); + return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); + } + /** * Start the given intent, handling security exceptions if they arise * diff --git a/api/src/com/todoroo/astrid/data/RemoteModel.java b/api/src/com/todoroo/astrid/data/RemoteModel.java index ed8adc848..542d5c2af 100644 --- a/api/src/com/todoroo/astrid/data/RemoteModel.java +++ b/api/src/com/todoroo/astrid/data/RemoteModel.java @@ -8,12 +8,14 @@ package com.todoroo.astrid.data; import org.json.JSONException; import org.json.JSONObject; +import android.graphics.Bitmap; import android.text.TextUtils; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.utility.AndroidUtilities; /** * A model that is synchronized to a remote server and has a remote id @@ -85,23 +87,40 @@ abstract public class RemoteModel extends AbstractModel { public String getPictureUrl(StringProperty pictureProperty, String size) { String value = getValue(pictureProperty); - try { - JSONObject pictureJson = new JSONObject(value); - return pictureJson.optString(size); - } catch (JSONException e) { - return value; - } + return PictureHelper.getPictureUrl(value, size); } - public static String getPictureUrlFromCursor(TodorooCursor cursor, StringProperty pictureProperty, String size) { - String value = cursor.get(pictureProperty); - try { - if (value == null) + public static class PictureHelper { + + public static String getPictureUrl(String value, String size) { + try { + if (value == null) + return null; + JSONObject pictureJson = new JSONObject(value); + if (pictureJson.has("data")) // Unpushed encoded bitmap //$NON-NLS-1$ + return null; + return pictureJson.optString(size); + } catch (JSONException e) { + return value; + } + } + + public static String getPictureUrlFromCursor(TodorooCursor cursor, StringProperty pictureProperty, String size) { + String value = cursor.get(pictureProperty); + return getPictureUrl(value, size); + } + + @SuppressWarnings("nls") + public static JSONObject uploadPictureJson(Bitmap bitmap) { + try { + JSONObject pictureJson = new JSONObject(); + pictureJson.put("name", "photo.jpg"); + pictureJson.put("type", "image/jpeg"); + pictureJson.put("data", AndroidUtilities.encodeBase64Bitmap(bitmap)); + return pictureJson; + } catch (JSONException e) { return null; - JSONObject pictureJson = new JSONObject(value); - return pictureJson.optString(size); - } catch (JSONException e) { - return value; + } } } } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/CommentsFragment.java b/astrid/plugin-src/com/todoroo/astrid/actfm/CommentsFragment.java index 0172dd57f..e0911fa51 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/CommentsFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/CommentsFragment.java @@ -5,6 +5,8 @@ */ package com.todoroo.astrid.actfm; +import org.json.JSONObject; + import android.app.Activity; import android.content.Intent; import android.database.Cursor; @@ -42,6 +44,7 @@ import com.todoroo.astrid.activity.AstridActivity; import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.adapter.UpdateAdapter; import com.todoroo.astrid.dao.UserActivityDao; +import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.helper.ImageDiskCache; import com.todoroo.astrid.helper.ProgressBarSyncResultCallback; @@ -319,35 +322,17 @@ public abstract class CommentsFragment extends ListFragment { } } - private String getPictureHashForUpdate(UserActivity u) { - String s = u.getValue(UserActivity.TARGET_ID) + u.getValue(UserActivity.CREATED_AT); - return s; - } protected void addComment() { UserActivity update = createUpdate(); - // TODO: Fix picture uploading -// if (picture != null) { -// update.setValue(Update.PICTURE, Update.PICTURE_LOADING); -// try { -// String updateString = getPictureHashForUpdate(update); -// imageCache.put(updateString, picture); -// update.setValue(Update.PICTURE, updateString); -// } -// catch (Exception e) { -// Log.e("CommentFragment", "Failed to put image to disk...", e); //$NON-NLS-1$//$NON-NLS-2$ -// } -// } -// update.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true); + if (picture != null) { + JSONObject pictureJson = RemoteModel.PictureHelper.uploadPictureJson(picture); + if (pictureJson != null) { + update.setValue(UserActivity.PICTURE, pictureJson.toString()); + } + + } + userActivityDao.createNew(update); -// -// final long updateId = update.getId(); -// final Bitmap tempPicture = picture; -// new Thread() { -// @Override -// public void run() { -// actFmSyncService.pushUpdate(updateId, tempPicture); -// } -// }.start(); addCommentField.setText(""); //$NON-NLS-1$ picture = null; diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagSettingsActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagSettingsActivity.java index d653ed26d..3ee855c90 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagSettingsActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagSettingsActivity.java @@ -291,6 +291,12 @@ public class TagSettingsActivity extends FragmentActivity { tagData.setValue(TagData.TAG_DESCRIPTION, newDesc); + if (setBitmap != null) { + JSONObject pictureJson = RemoteModel.PictureHelper.uploadPictureJson(setBitmap); + if (pictureJson != null) + tagData.setValue(TagData.PICTURE, pictureJson.toString()); + } + JSONArray members; try { members = tagMembers.parseSharedWithAndTags(this, true).optJSONArray("p"); diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java index 7bfd36f04..03c1dde58 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/NameMaps.java @@ -164,7 +164,7 @@ public class NameMaps { putTagPropertyToServerName(TagData.PUSHED_AT, "pushed_at", true); putTagPropertyToServerName(TagData.TASK_COUNT, "task_count", true); putTagPropertyToServerName(TagData.TAG_DESCRIPTION, "description", false); - putTagPropertyToServerName(TagData.PICTURE, "picture", true); + putTagPropertyToServerName(TagData.PICTURE, "picture", false); // Reverse the mapping to construct the server to local map TAG_DATA_PROPERTIES_SERVER_TO_LOCAL = AndroidUtilities.reverseMap(TAG_DATA_PROPERTIES_LOCAL_TO_SERVER); @@ -229,7 +229,7 @@ public class NameMaps { putUserActivityPropertyToServerName(UserActivity.USER_UUID, "user_id", false); putUserActivityPropertyToServerName(UserActivity.ACTION, "action", false); putUserActivityPropertyToServerName(UserActivity.MESSAGE, "message", false); - putUserActivityPropertyToServerName(UserActivity.PICTURE, "picture", true); + putUserActivityPropertyToServerName(UserActivity.PICTURE, "picture", false); putUserActivityPropertyToServerName(UserActivity.TARGET_ID, "target_id", false); putUserActivityPropertyToServerName(UserActivity.TARGET_NAME, "target_name", false); putUserActivityPropertyToServerName(UserActivity.CREATED_AT, "created_at", false); diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 9d74cd46e..450078db0 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -395,7 +395,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable { if (!titleOnlyLayout) { viewHolder.isTaskRabbit = (cursor.get(TASK_RABBIT_ID) > 0); viewHolder.tagsString = cursor.get(TAGS); - viewHolder.imageUrl = RemoteModel.getPictureUrlFromCursor(cursor, PICTURE, RemoteModel.PICTURE_THUMB); + viewHolder.imageUrl = RemoteModel.PictureHelper.getPictureUrlFromCursor(cursor, PICTURE, RemoteModel.PICTURE_THUMB); } Task task = viewHolder.task;