/** * */ package org.commcare.android.database.user.models; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Date; import org.commcare.android.database.EncryptedModel; import org.javarosa.core.model.utils.DateUtils; import org.javarosa.core.services.storage.IMetaData; import org.javarosa.core.services.storage.Persistable; import org.javarosa.core.util.externalizable.DeserializationException; import org.javarosa.core.util.externalizable.ExtUtil; import org.javarosa.core.util.externalizable.PrototypeFactory; import com.google.android.maps.GeoPoint; /** * @author ctsims * */ public class GeocodeCacheModel implements IMetaData, Persistable, EncryptedModel { public static final String STORAGE_KEY = "geocodecache"; public static final String META_LAST_QUERY = "lastquery"; public static final String META_LOCATION = "location"; public static final String META_HIT = "hit"; public static final String META_HIT_TRUE = "t"; public static final String META_HIT_FALSE = "f"; private int recordId = -1; int lat = -1; int lon = -1; Date lastQueried; String location; boolean hit; public GeocodeCacheModel() { } public GeocodeCacheModel(String location, int lat, int lon) { this(location, lat, lon, new Date()); } public GeocodeCacheModel(String location, int lat, int lon, Date queried) { hit = true; this.location = location; this.lat = lat; this.lon = lon; this.lastQueried = queried; } public static GeocodeCacheModel NoHitRecord(String val) { GeocodeCacheModel model = new GeocodeCacheModel(); model.location = val; model.hit = false; model.lastQueried = new Date(); return model; } public boolean isEncrypted(String data) { if(data.equals(META_LAST_QUERY) || data.equals(META_HIT)) { return false; } return true; } public boolean isBlobEncrypted() { return true; } public void readExternal(DataInputStream in, PrototypeFactory pf) throws IOException, DeserializationException { lastQueried = ExtUtil.readDate(in); hit = ExtUtil.readBool(in); location = ExtUtil.readString(in); if(hit) { lat = ExtUtil.readInt(in); lon = ExtUtil.readInt(in); } } public void writeExternal(DataOutputStream out) throws IOException { ExtUtil.writeDate(out, lastQueried); ExtUtil.writeBool(out, hit); ExtUtil.writeString(out,location); if(hit) { ExtUtil.writeNumeric(out,lat); ExtUtil.writeNumeric(out,lon); } } public GeoPoint getGeoPoint() { return new GeoPoint(lat,lon); } public void setID(int ID) { recordId = ID; } public int getID() { return recordId; } public String[] getMetaDataFields() { return new String[] {META_LAST_QUERY, META_LOCATION, META_HIT}; } public Object getMetaData(String fieldName) { if(META_LAST_QUERY.equals(fieldName)) { return DateUtils.formatDate(lastQueried, DateUtils.FORMAT_ISO8601); } else if(META_LOCATION.equals(fieldName)) { return location; } else if(META_HIT.equals(fieldName)) { if(hit) { return META_HIT_TRUE; } else {return META_HIT_FALSE; } } throw new IllegalArgumentException("No metadata field " + fieldName + " for Geocoder Cache Models"); } /** * Whether this represents a location which has a geopoint, or one which failed to look up */ public boolean dataExists() { return hit; } }