/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.data;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
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.DateUtilities;
/**
* A model that is synchronized to a remote server and has a remote id
*
* @author Tim Su <tim@todoroo.com>
*
*/
abstract public class RemoteModel extends AbstractModel {
/** remote id property common to all remote models */
public static final String UUID_PROPERTY_NAME = "remoteId"; //$NON-NLS-1$
/** remote id property */
public static final StringProperty UUID_PROPERTY = new StringProperty(null, UUID_PROPERTY_NAME);
/** user id property common to all remote models */
protected static final String USER_ID_PROPERTY_NAME = "userId"; //$NON-NLS-1$
/** user id property */
public static final StringProperty USER_ID_PROPERTY = new StringProperty(null, USER_ID_PROPERTY_NAME);
/** user json property common to all remote models */
protected static final String USER_JSON_PROPERTY_NAME = "user"; //$NON-NLS-1$
/** user json property */
@Deprecated public static final StringProperty USER_JSON_PROPERTY = new StringProperty(null, USER_JSON_PROPERTY_NAME);
/** pushed at date property name */
public static final String PUSHED_AT_PROPERTY_NAME = "pushedAt"; //$NON-NLS-1$
/** pushed at date property name */
public static final LongProperty PUSHED_AT_PROPERTY = new LongProperty(null, PUSHED_AT_PROPERTY_NAME);
/** constant value for no uuid */
public static final String NO_UUID = "0"; //$NON-NLS-1$
public static final boolean isValidUuid(String uuid) {
try {
long value = Long.parseLong(uuid);
return value > 0;
} catch (NumberFormatException e) {
return isUuidEmpty(uuid);
}
}
/**
* Utility method to get the identifier of the model, if it exists.
*
* @return {@value #NO_UUID} if this model was not added to the database
*/
abstract public String getUuid();
protected String getUuidHelper(StringProperty uuid) {
if(setValues != null && setValues.containsKey(uuid.name))
return setValues.getAsString(uuid.name);
else if(values != null && values.containsKey(uuid.name))
return values.getAsString(uuid.name);
else
return NO_UUID;
}
public void setUuid(String uuid) {
if (setValues == null)
setValues = new ContentValues();
if(NO_UUID.equals(uuid))
clearValue(UUID_PROPERTY);
else
setValues.put(UUID_PROPERTY_NAME, uuid);
}
public static boolean isUuidEmpty(String uuid) {
return NO_UUID.equals(uuid) || TextUtils.isEmpty(uuid);
}
public static final String PICTURE_THUMB = "thumb"; //$NON-NLS-1$
public static final String PICTURE_MEDIUM = "medium"; //$NON-NLS-1$
public static final String PICTURE_LARGE = "large"; //$NON-NLS-1$
public String getPictureUrl(StringProperty pictureProperty, String size) {
String value = getValue(pictureProperty);
return PictureHelper.getPictureUrl(value, size);
}
public Bitmap getPictureBitmap(StringProperty pictureProperty) {
String value = getValue(pictureProperty);
return PictureHelper.getPictureBitmap(value);
}
public static class PictureHelper {
public static final String PICTURES_DIRECTORY = "pictures"; //$NON-NLS-1$
public static String getPictureHash(UserActivity update) {
return String.format("cached::%s%s", update.getValue(UserActivity.TARGET_ID), update.getValue(UserActivity.CREATED_AT));
}
public static String getPictureHash(TagData tagData) {
long tag_date = 0;
if (tagData.containsValue(TagData.CREATION_DATE)) {
tag_date = tagData.getValue(TagData.CREATION_DATE);
}
if (tag_date == 0) {
tag_date = DateUtilities.dateToUnixtime(new Date());
}
return String.format("cached::%s%s", tagData.getValue(TagData.NAME), tag_date);
}
@SuppressWarnings("nls")
public static JSONObject savePictureJson(Context context, Bitmap bitmap) {
try {
String name = DateUtilities.now() + ".jpg";
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", name);
jsonObject.put("type", "image/jpeg");
File dir = context.getExternalFilesDir(PICTURES_DIRECTORY);
if (dir != null) {
File file = new File(dir + File.separator + DateUtilities.now() + ".jpg");
if (file.exists())
return null;
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.flush();
fos.close();
jsonObject.put("path", file.getAbsolutePath());
} catch (FileNotFoundException e) {
//
} catch (IOException e) {
//
}
return jsonObject;
} else {
return null;
}
} catch (JSONException e) {
//
}
return null;
}
public static String getPictureUrl(String value, String size) {
try {
if (value == null)
return null;
JSONObject pictureJson = new JSONObject(value);
if (pictureJson.has("path")) // Unpushed encoded bitmap //$NON-NLS-1$
return null;
return pictureJson.optString(size);
} catch (JSONException e) {
return value;
}
}
@SuppressWarnings("nls")
public static Bitmap getPictureBitmap(String value) {
try {
if (value == null)
return null;
if (value.contains("path")) {
JSONObject pictureJson = new JSONObject(value);
if (pictureJson.has("path")) {
String path = pictureJson.getString("path");
return BitmapFactory.decodeFile(path);
}
}
return null;
} catch (JSONException e) {
return null;
}
}
public static String getPictureUrlFromCursor(TodorooCursor<?> cursor, StringProperty pictureProperty, String size) {
String value = cursor.get(pictureProperty);
return getPictureUrl(value, size);
}
}
}