/*
* Copyright 2012 osmdroid: M.Kergall
* 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.oscim.app;
import java.util.ArrayList;
import java.util.List;
import org.oscim.core.BoundingBox;
import org.oscim.core.GeoPoint;
import org.oscim.overlay.OverlayItem;
import org.oscim.view.MapView;
import org.osmdroid.location.FlickrPOIProvider;
import org.osmdroid.location.FourSquareProvider;
import org.osmdroid.location.GeoNamesPOIProvider;
import org.osmdroid.location.NominatimPOIProvider;
import org.osmdroid.location.POI;
import org.osmdroid.location.PicasaPOIProvider;
import org.osmdroid.overlays.DefaultInfoWindow;
import org.osmdroid.overlays.ExtendedOverlayItem;
import org.osmdroid.overlays.ItemizedOverlayWithBubble;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class POISearch {
private final ArrayList<POI> mPOIs;
ItemizedOverlayWithBubble<ExtendedOverlayItem> poiMarkers;
final TileMap tileMap;
Drawable[] mMarkers;
private final static int MDEFAULT = 0;
private final static int MFLICKR = 1;
private final static int MPICASA = 2;
private final static int MWIKI16 = 3;
private final static int MWIKI32 = 4;
POISearch(TileMap tileMap) {
this.tileMap = tileMap;
mPOIs = new ArrayList<POI>();
//POI markers:
final ArrayList<ExtendedOverlayItem> poiItems = new ArrayList<ExtendedOverlayItem>();
poiMarkers = new ItemizedOverlayWithBubble<ExtendedOverlayItem>(App.map, tileMap,
poiItems, new POIInfoWindow(App.map));
App.map.getOverlays().add(poiMarkers);
// if (savedInstanceState != null) {
// mPOIs = savedInstanceState.getParcelableArrayList("poi");
// updateUIWithPOI(mPOIs);
// }
mMarkers = new Drawable[5];
mMarkers[MDEFAULT] = App.res.getDrawable(R.drawable.marker_poi_default);
mMarkers[MFLICKR] = App.res.getDrawable(R.drawable.marker_poi_flickr);
mMarkers[MPICASA] = App.res.getDrawable(R.drawable.marker_poi_picasa_24);
mMarkers[MWIKI16] = App.res.getDrawable(R.drawable.marker_poi_wikipedia_16);
mMarkers[MWIKI32] = App.res.getDrawable(R.drawable.marker_poi_wikipedia_32);
}
public List<POI> getPOIs() {
return mPOIs;
}
class POITask extends AsyncTask<Object, Void, List<POI>> {
String mTag;
@Override
protected List<POI> doInBackground(Object... params) {
mTag = (String) params[0];
if (mTag == null || mTag.equals("")) {
return null;
} else if (mTag.equals("wikipedia")) {
GeoNamesPOIProvider poiProvider = new GeoNamesPOIProvider("mkergall");
//ArrayList<POI> pois = poiProvider.getPOICloseTo(point, 30, 20.0);
//Get POI inside the bounding box of the current map view:
BoundingBox bb = App.map.getBoundingBox();
ArrayList<POI> pois = poiProvider.getPOIInside(bb, 30);
return pois;
} else if (mTag.equals("flickr")) {
FlickrPOIProvider poiProvider = new FlickrPOIProvider(
"c39be46304a6c6efda8bc066c185cd7e");
BoundingBox bb = App.map.getBoundingBox();
ArrayList<POI> pois = poiProvider.getPOIInside(bb, null, 20);
return pois;
} else if (mTag.startsWith("picasa")) {
PicasaPOIProvider poiProvider = new PicasaPOIProvider(null);
BoundingBox bb = App.map.getBoundingBox();
String q = mTag.substring("picasa".length());
List<POI> pois = poiProvider.getPOIInside(bb, q, 20);
return pois;
}
else if (mTag.startsWith("foursquare")) {
FourSquareProvider poiProvider = new FourSquareProvider(null, null);
BoundingBox bb = App.map.getBoundingBox();
String q = mTag.substring("foursquare".length());
// String q = mTag.substring("picasa".length());
ArrayList<POI> pois = poiProvider.getPOIInside(bb, q, 40);
return pois;
}
else {
NominatimPOIProvider poiProvider = new NominatimPOIProvider();
// poiProvider.setService(NominatimPOIProvider.MAPQUEST_POI_SERVICE);
poiProvider.setService(NominatimPOIProvider.NOMINATIM_POI_SERVICE);
ArrayList<POI> pois;
// if (destinationPoint == null) {
BoundingBox bb = App.map.getBoundingBox();
pois = poiProvider.getPOIInside(bb, mTag, 10);
//pois = poiProvider.getPOI( mTag, 10);
// } else {
// pois = poiProvider.getPOIAlong(mRoad.getRouteLow(), mTag, 100, 2.0);
// }
return pois;
}
}
@Override
protected void onPostExecute(List<POI> pois) {
if (mTag.equals("")) {
//no search, no message
} else if (pois == null) {
Toast
.makeText(tileMap.getApplicationContext(),
"Technical issue when getting " + mTag + " POI.", Toast.LENGTH_LONG)
.show();
} else {
Toast.makeText(tileMap.getApplicationContext(),
"" + pois.size() + " " + mTag + " entries found",
Toast.LENGTH_LONG).show();
// if (mTag.equals("flickr") || mTag.startsWith("picasa") || mTag.equals("wikipedia"))
// startAsyncThumbnailsLoading(mPOIs);
}
updateUIWithPOI(pois);
}
}
void updateUIWithPOI(List<POI> pois) {
mPOIs.clear();
if (pois != null) {
mPOIs.addAll(pois);
for (POI poi : pois) {
String desc = null;
String name = null;
if (poi.serviceId == POI.POI_SERVICE_NOMINATIM) {
name = poi.description;
String[] split = name.split(", ");
if (split != null && split.length > 1) {
name = split[0];
desc = split[1];
for (int i = 2; i < 3 && i < split.length; i++)
desc += "," + split[i];
}
} else {
desc = poi.description;
}
ExtendedOverlayItem poiMarker = new ExtendedOverlayItem(
poi.type + (name == null ? "" : ": " + name), desc, poi.location);
Drawable marker = null;
if (poi.serviceId == POI.POI_SERVICE_NOMINATIM) {
marker = mMarkers[MDEFAULT];
} else if (poi.serviceId == POI.POI_SERVICE_GEONAMES_WIKIPEDIA) {
if (poi.rank < 90)
marker = mMarkers[MWIKI16];
else
marker = mMarkers[MWIKI32];
} else if (poi.serviceId == POI.POI_SERVICE_FLICKR) {
marker = mMarkers[MFLICKR];
} else if (poi.serviceId == POI.POI_SERVICE_PICASA) {
marker = mMarkers[MPICASA];
poiMarker.setSubDescription(poi.category);
} else if (poi.serviceId == POI.POI_SERVICE_4SQUARE) {
marker = mMarkers[MDEFAULT];
poiMarker.setSubDescription(poi.category);
}
poiMarker.setMarker(marker);
poiMarker.setMarkerHotspot(OverlayItem.HotspotPlace.CENTER);
//thumbnail loading moved in POIInfoWindow.onOpen for better performances.
poiMarker.setRelatedObject(poi);
poiMarkers.addItem(poiMarker);
}
}
Intent intent = new Intent(tileMap.getApplicationContext(), POIActivity.class);
intent.putExtra("ID", poiMarkers.getBubbledItemId());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
tileMap.startActivityForResult(intent, TileMap.POIS_REQUEST);
App.map.redrawMap(true);
}
void getPOIAsync(String tag) {
poiMarkers.removeAllItems();
new POITask().execute(tag);
}
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)
return;
if (poi.serviceId == POI.POI_SERVICE_4SQUARE) {
FourSquareProvider.browse(view.getContext(), poi);
} else if (poi.url != null) {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(poi.url));
i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
view.getContext().startActivity(i);
}
}
});
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);
}
}
void singleTapUp() {
poiMarkers.hideBubble();
}
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_nearby:
Intent intent = new Intent(tileMap, POIActivity.class);
intent.putExtra("ID", poiMarkers.getBubbledItemId());
tileMap.startActivityForResult(intent, TileMap.POIS_REQUEST);
return true;
default:
}
return false;
}
}