Added ability to upload pictures with comments and tags

pull/14/head
Sam Bosley 12 years ago
parent dd957f773c
commit 9853d90948

@ -7,6 +7,7 @@ package com.todoroo.andlib.utility;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -47,6 +48,7 @@ import android.net.NetworkInfo;
import android.net.NetworkInfo.State; import android.net.NetworkInfo.State;
import android.os.Bundle; import android.os.Bundle;
import android.text.InputType; import android.text.InputType;
import android.util.Base64;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.MotionEvent; import android.view.MotionEvent;
@ -139,6 +141,18 @@ public class AndroidUtilities {
return bitmap; 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 * Start the given intent, handling security exceptions if they arise
* *

@ -8,12 +8,14 @@ package com.todoroo.astrid.data;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import android.graphics.Bitmap;
import android.text.TextUtils; import android.text.TextUtils;
import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.LongProperty;
import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.Property.StringProperty;
import com.todoroo.andlib.data.TodorooCursor; 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 * A model that is synchronized to a remote server and has a remote id
@ -85,8 +87,18 @@ abstract public class RemoteModel extends AbstractModel {
public String getPictureUrl(StringProperty pictureProperty, String size) { public String getPictureUrl(StringProperty pictureProperty, String size) {
String value = getValue(pictureProperty); String value = getValue(pictureProperty);
return PictureHelper.getPictureUrl(value, size);
}
public static class PictureHelper {
public static String getPictureUrl(String value, String size) {
try { try {
if (value == null)
return null;
JSONObject pictureJson = new JSONObject(value); JSONObject pictureJson = new JSONObject(value);
if (pictureJson.has("data")) // Unpushed encoded bitmap //$NON-NLS-1$
return null;
return pictureJson.optString(size); return pictureJson.optString(size);
} catch (JSONException e) { } catch (JSONException e) {
return value; return value;
@ -95,13 +107,20 @@ abstract public class RemoteModel extends AbstractModel {
public static String getPictureUrlFromCursor(TodorooCursor<?> cursor, StringProperty pictureProperty, String size) { public static String getPictureUrlFromCursor(TodorooCursor<?> cursor, StringProperty pictureProperty, String size) {
String value = cursor.get(pictureProperty); String value = cursor.get(pictureProperty);
return getPictureUrl(value, size);
}
@SuppressWarnings("nls")
public static JSONObject uploadPictureJson(Bitmap bitmap) {
try { try {
if (value == null) JSONObject pictureJson = new JSONObject();
return null; pictureJson.put("name", "photo.jpg");
JSONObject pictureJson = new JSONObject(value); pictureJson.put("type", "image/jpeg");
return pictureJson.optString(size); pictureJson.put("data", AndroidUtilities.encodeBase64Bitmap(bitmap));
return pictureJson;
} catch (JSONException e) { } catch (JSONException e) {
return value; return null;
}
} }
} }
} }

@ -5,6 +5,8 @@
*/ */
package com.todoroo.astrid.actfm; package com.todoroo.astrid.actfm;
import org.json.JSONObject;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
@ -42,6 +44,7 @@ import com.todoroo.astrid.activity.AstridActivity;
import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.adapter.UpdateAdapter; import com.todoroo.astrid.adapter.UpdateAdapter;
import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityDao;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivity;
import com.todoroo.astrid.helper.ImageDiskCache; import com.todoroo.astrid.helper.ImageDiskCache;
import com.todoroo.astrid.helper.ProgressBarSyncResultCallback; 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() { protected void addComment() {
UserActivity update = createUpdate(); UserActivity update = createUpdate();
// TODO: Fix picture uploading if (picture != null) {
// if (picture != null) { JSONObject pictureJson = RemoteModel.PictureHelper.uploadPictureJson(picture);
// update.setValue(Update.PICTURE, Update.PICTURE_LOADING); if (pictureJson != null) {
// try { update.setValue(UserActivity.PICTURE, pictureJson.toString());
// 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);
userActivityDao.createNew(update); 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$ addCommentField.setText(""); //$NON-NLS-1$
picture = null; picture = null;

@ -291,6 +291,12 @@ public class TagSettingsActivity extends FragmentActivity {
tagData.setValue(TagData.TAG_DESCRIPTION, newDesc); 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; JSONArray members;
try { try {
members = tagMembers.parseSharedWithAndTags(this, true).optJSONArray("p"); members = tagMembers.parseSharedWithAndTags(this, true).optJSONArray("p");

@ -164,7 +164,7 @@ public class NameMaps {
putTagPropertyToServerName(TagData.PUSHED_AT, "pushed_at", true); putTagPropertyToServerName(TagData.PUSHED_AT, "pushed_at", true);
putTagPropertyToServerName(TagData.TASK_COUNT, "task_count", true); putTagPropertyToServerName(TagData.TASK_COUNT, "task_count", true);
putTagPropertyToServerName(TagData.TAG_DESCRIPTION, "description", false); 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 // Reverse the mapping to construct the server to local map
TAG_DATA_PROPERTIES_SERVER_TO_LOCAL = AndroidUtilities.reverseMap(TAG_DATA_PROPERTIES_LOCAL_TO_SERVER); 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.USER_UUID, "user_id", false);
putUserActivityPropertyToServerName(UserActivity.ACTION, "action", false); putUserActivityPropertyToServerName(UserActivity.ACTION, "action", false);
putUserActivityPropertyToServerName(UserActivity.MESSAGE, "message", 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_ID, "target_id", false);
putUserActivityPropertyToServerName(UserActivity.TARGET_NAME, "target_name", false); putUserActivityPropertyToServerName(UserActivity.TARGET_NAME, "target_name", false);
putUserActivityPropertyToServerName(UserActivity.CREATED_AT, "created_at", false); putUserActivityPropertyToServerName(UserActivity.CREATED_AT, "created_at", false);

@ -395,7 +395,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
if (!titleOnlyLayout) { if (!titleOnlyLayout) {
viewHolder.isTaskRabbit = (cursor.get(TASK_RABBIT_ID) > 0); viewHolder.isTaskRabbit = (cursor.get(TASK_RABBIT_ID) > 0);
viewHolder.tagsString = cursor.get(TAGS); 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; Task task = viewHolder.task;

Loading…
Cancel
Save