/* * Copyright 2012 Hannes Janetzek * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package org.osmdroid.overlays; import java.util.HashMap; import java.util.List; import org.oscim.app.R; import org.oscim.core.BoundingBox; import org.oscim.core.MapPosition; import org.oscim.overlay.OverlayItem; import org.oscim.view.MapView; import org.osmdroid.location.FlickrPOIProvider; import org.osmdroid.location.POI; import org.osmdroid.location.POIProvider; import org.osmdroid.utils.BonusPackHelper; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class POIOverlay extends ItemizedOverlayWithBubble<ExtendedOverlayItem> { POIProvider mPoiProvider; UpdateTask mUpdateTask; boolean mTaskRunning; Drawable mMarker; BoundingBox mBoundingBox; public POIOverlay(MapView mapView, Context context, List<ExtendedOverlayItem> aList, InfoWindow bubble) { super(mapView, context, aList, bubble); mUpdateTask = new UpdateTask(); FlickrPOIProvider provider = new FlickrPOIProvider("c39be46304a6c6efda8bc066c185cd7e"); provider.setPrevious(mPOIMap); mPoiProvider = provider; mMarker = context.getResources().getDrawable(R.drawable.marker_poi_flickr); } public void setPoiProvider(POIProvider poiProvider) { mPoiProvider = poiProvider; } @Override public void onUpdate(MapPosition mapPosition, boolean changed) { super.onUpdate(mapPosition, changed); if (changed && !mTaskRunning) { mMapView.postDelayed(mUpdateTask, 1000); mTaskRunning = true; } } class UpdateTask implements Runnable { @Override public void run() { mTaskRunning = false; BoundingBox bb = mMapView.getBoundingBox(); if (mBoundingBox == null || !mBoundingBox.equals(bb)) { // synchronized (mBoundingBox) { mBoundingBox = bb; // } // check bounding box Log.d(BonusPackHelper.LOG_TAG, " update pois"); new POITask().execute(); } } } HashMap<String, POI> mPOIMap = new HashMap<String, POI>(100); class POITask extends AsyncTask<Object, Void, List<POI>> { @Override protected List<POI> doInBackground(Object... params) { return mPoiProvider.getPOIInside(mBoundingBox, "", 20); } @Override protected void onPostExecute(List<POI> pois) { // removeAllItems(); if (pois != null) { for (POI poi : pois) { ExtendedOverlayItem poiMarker = new ExtendedOverlayItem(poi.type, poi.description, poi.location); poiMarker.setMarker(mMarker); poiMarker.setMarkerHotspot(OverlayItem.HotspotPlace.CENTER); //thumbnail loading moved in POIInfoWindow.onOpen for better performances. poiMarker.setRelatedObject(poi); addItem(poiMarker); mPOIMap.put(poi.id, poi); } } mMapView.redrawMap(true); } } public static class POIInfoWindow extends DefaultInfoWindow { private Button mButton; private ImageView mImage; public POIInfoWindow(MapView mapView) { super(R.layout.bonuspack_bubble, mapView); mButton = (Button) mView.findViewById(R.id.bubble_moreinfo); mImage = (ImageView) mView.findViewById(R.id.bubble_image); //bonuspack_bubble layouts already contain a "more info" button. mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { POI poi = (POI) view.getTag(); if (poi != null && poi.url != null) { Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(poi.url)); view.getContext().startActivity(myIntent); } } }); // getView().setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View view) { // POI poi = (POI) view.getTag(); // // if (poi != null) { // Intent intent = new Intent(tileMap, POIActivity.class); // intent.putExtra("ID", poiMarkers.getBubbledItemId()); // tileMap.startActivityForResult(intent, TileMap.POIS_REQUEST); // } // } // }); } @Override public void onOpen(ExtendedOverlayItem item) { POI poi = (POI) item.getRelatedObject(); super.onOpen(item); poi.fetchThumbnail(mImage); //Show or hide "more info" button: if (poi.url != null) mButton.setVisibility(View.VISIBLE); else mButton.setVisibility(View.GONE); mButton.setTag(poi); getView().setTag(poi); } } }