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.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
*

@ -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;
}
}
}
}

@ -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;

@ -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");

@ -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);

@ -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;

Loading…
Cancel
Save