package org.osmdroid.location;
import org.oscim.app.R;
import org.oscim.core.BoundingBox;
import org.oscim.core.GeoPoint;
import org.osmdroid.utils.BonusPackHelper;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
/**
* Point of Interest. Exact content may depend of the POI provider used.
* @see NominatimPOIProvider
* @see GeoNamesPOIProvider
* @author M.Kergall
*/
public class POI implements Parcelable {
/** IDs of POI services */
public static int POI_SERVICE_NOMINATIM = 100;
public static int POI_SERVICE_GEONAMES_WIKIPEDIA = 200;
public static int POI_SERVICE_FLICKR = 300;
public static int POI_SERVICE_PICASA = 400;
public static int POI_SERVICE_4SQUARE = 500;
/** Identifies the service provider of this POI. */
public int serviceId;
/** Nominatim: OSM ID. GeoNames: 0 */
public String id;
/** location of the POI */
public GeoPoint location;
public BoundingBox bbox;
/** Nominatim "class", GeoNames "feature" */
public String category;
/** type or title */
public String type;
/** can be the name, the address, a short description */
public String description;
/** url of the thumbnail. Null if none */
public String thumbnailPath;
/** the thumbnail itself. Null if none */
public Bitmap thumbnail;
/** url to a more detailed information page about this POI. Null if none */
public String url;
/**
* popularity of this POI, from 1 (lowest) to 100 (highest). 0 if not
* defined.
*/
public int rank;
/** number of attempts to load the thumbnail that have failed */
protected int mThumbnailLoadingFailures;
public POI(int serviceId) {
this.serviceId = serviceId;
// lets all other fields empty or null. That's fine.
}
protected static int MAX_LOADING_ATTEMPTS = 2;
/**
* @return the POI thumbnail as a Bitmap, if any. If not done yet, it will
* load the POI thumbnail from its url (in thumbnailPath field).
*/
public Bitmap getThumbnail() {
if (thumbnail == null && thumbnailPath != null) {
Log.d(BonusPackHelper.LOG_TAG, "POI:load thumbnail:" + thumbnailPath);
thumbnail = BonusPackHelper.loadBitmap(thumbnailPath);
if (thumbnail == null) {
mThumbnailLoadingFailures++;
if (mThumbnailLoadingFailures >= MAX_LOADING_ATTEMPTS) {
// this path really doesn't work, "kill" it for next calls:
thumbnailPath = null;
}
}
}
return thumbnail;
}
// http://stackoverflow.com/questions/7729133/using-asynctask-to-load-images-in-listview
// TODO see link, there might be a better solution
/**
* Fetch the thumbnail from its url on a thread.
* @param imageView
* to update once the thumbnail is retrieved, or to hide if no
* thumbnail.
*/
public void fetchThumbnail(final ImageView imageView) {
if (thumbnail != null) {
imageView.setImageBitmap(thumbnail);
imageView.setVisibility(View.VISIBLE);
} else if (thumbnailPath != null) {
imageView.setImageResource(R.drawable.ic_empty);
imageView.setVisibility(View.VISIBLE);
new ThumbnailTask(imageView).execute(imageView);
} else {
imageView.setVisibility(View.GONE);
}
}
class ThumbnailTask extends AsyncTask<ImageView, Void, ImageView> {
public ThumbnailTask(ImageView iv) {
iv.setTag(thumbnailPath);
}
@Override
protected ImageView doInBackground(ImageView... params) {
getThumbnail();
return params[0];
}
@Override
protected void onPostExecute(ImageView iv) {
if (iv == null || thumbnail == null)
return;
if (thumbnailPath.equals(iv.getTag().toString()))
iv.setImageBitmap(thumbnail);
}
}
// --- Parcelable implementation
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(serviceId);
out.writeString(id);
out.writeParcelable(location, 0);
out.writeString(category);
out.writeString(type);
out.writeString(description);
out.writeString(thumbnailPath);
out.writeParcelable(thumbnail, 0);
out.writeString(url);
out.writeInt(rank);
out.writeInt(mThumbnailLoadingFailures);
}
public static final Parcelable.Creator<POI> CREATOR = new Parcelable.Creator<POI>() {
@Override
public POI createFromParcel(Parcel in) {
POI poi = new POI(in.readInt());
poi.id = in.readString();
poi.location = in.readParcelable(GeoPoint.class.getClassLoader());
poi.category = in.readString();
poi.type = in.readString();
poi.description = in.readString();
poi.thumbnailPath = in.readString();
poi.thumbnail = in.readParcelable(Bitmap.class.getClassLoader());
poi.url = in.readString();
poi.rank = in.readInt();
poi.mThumbnailLoadingFailures = in.readInt();
return poi;
}
@Override
public POI[] newArray(int size) {
return new POI[size];
}
};
// private POI(Parcel in) {
// serviceId = in.readInt();
// id = in.readLong();
// location = in.readParcelable(GeoPoint.class.getClassLoader());
// category = in.readString();
// type = in.readString();
// description = in.readString();
// thumbnailPath = in.readString();
// thumbnail = in.readParcelable(Bitmap.class.getClassLoader());
// url = in.readString();
// rank = in.readInt();
// mThumbnailLoadingFailures = in.readInt();
// }
}