/** * */ package org.commcare.dalvik.geo; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import org.commcare.android.models.Entity; import org.commcare.suite.model.Detail; import org.commcare.suite.model.DetailField; import org.javarosa.core.model.instance.TreeReference; import org.javarosa.core.reference.InvalidReferenceException; import org.javarosa.core.reference.ReferenceManager; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import com.google.android.maps.GeoPoint; /** * @author ctsims * */ public class EntityOverlayItemFactory { int imageIndex = -1; int bigTextIndex = -1; int smallTextIndex = -1; private Map<String, Drawable> drawables; private HashSet<String> missingImages; private Drawable defDrawable; public EntityOverlayItemFactory(Detail shortDetail, Drawable defDrawable) { DetailField[] fields = shortDetail.getFields(); for(int i = 0 ; i < fields.length ; ++i) { String form = fields[i].getTemplateForm(); //TODO: Deal with multiple images if("image".equals(form)) { imageIndex = i; } if("".equals(form) && (fields[i].getTemplateHint() == -1 || fields[i].getTemplateHint() > 0)) { if(bigTextIndex == -1) { bigTextIndex = i; } else if(smallTextIndex == -1) { smallTextIndex = i; } } } drawables = new HashMap<String, Drawable>(); missingImages = new HashSet<String>(); this.defDrawable = defDrawable; } public EntityOverlayItem generateOverlay(GeoPoint gp, Entity<TreeReference> e) { Drawable custom = null; if(imageIndex != -1) { String URI = (String) e.getField(imageIndex); if(URI != null && URI != "") { if(drawables.containsKey(URI)) { custom = drawables.get(URI); } else { if(!missingImages.contains(URI)) { custom = loadDrawable(URI); } } } } String big = bigTextIndex == -1 ? "" : (String) e.getField(bigTextIndex); String small = smallTextIndex == -1 ? "" : (String) e.getField(smallTextIndex); return new EntityOverlayItem(gp, big, small, custom); } private Drawable loadDrawable(String URI) { try { Drawable d = Drawable.createFromStream(ReferenceManager._().DeriveReference(URI).getStream(), URI); if(d != null) { //TODO: Resize; Bitmap bitmap = ((BitmapDrawable) d).getBitmap(); // Scale it to 50 x 50 d = new BitmapDrawable(Bitmap.createScaledBitmap(bitmap, defDrawable.getIntrinsicWidth(), defDrawable.getIntrinsicHeight(), true)); // Set your new, scaled drawable "d" d = EntityOverlay.bcb(d); drawables.put(URI, d); return d; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvalidReferenceException e) { // TODO Auto-generated catch block e.printStackTrace(); } missingImages.add(URI); return null; } }