diff --git a/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java b/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java deleted file mode 100644 index 8f26207564..0000000000 --- a/OsmAnd/src/net/osmand/plus/NameFinderPoiFilter.java +++ /dev/null @@ -1,145 +0,0 @@ -package net.osmand.plus; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; - -import net.osmand.LogUtil; -import net.osmand.ResultMatcher; -import net.osmand.data.Amenity; -import net.osmand.data.AmenityType; -import net.osmand.osm.MapUtils; -import net.sf.junidecode.Junidecode; - -import org.apache.commons.logging.Log; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import android.util.Xml; - -public class NameFinderPoiFilter extends PoiFilter { - - public static final String FILTER_ID = "name_finder"; //$NON-NLS-1$ - private static final Log log = LogUtil.getLog(NameFinderPoiFilter.class); - private static final int LIMIT = 300; - - List searchedAmenities = new ArrayList(); - - - private String query = ""; //$NON-NLS-1$ - private String lastError = ""; //$NON-NLS-1$ - - public NameFinderPoiFilter(OsmandApplication application) { - super(null, application); - this.name = application.getString(R.string.poi_filter_nominatim); //$NON-NLS-1$ - this.distanceToSearchValues = new double[] {1, 2, 5, 10, 20, 30, 100, 250 }; - this.filterId = FILTER_ID; - } - - @Override - public List searchAgain(double lat, double lon) { - MapUtils.sortListOfMapObject(searchedAmenities, lat, lon); - return searchedAmenities; - } - - public String getQuery() { - return query; - } - - public void setQuery(String query) { - this.query = query; - } - - @Override - protected List searchAmenities(double lat, double lon, double topLatitude, - double bottomLatitude, double leftLongitude, double rightLongitude, ResultMatcher matcher) { - searchedAmenities.clear(); - - String viewbox = "viewboxlbrt="+((float) leftLongitude)+","+((float) bottomLatitude)+","+((float) rightLongitude)+","+((float) topLatitude); - try { - lastError = ""; - String urlq = "http://nominatim.openstreetmap.org/search/"+URLEncoder.encode(query)+ "?format=xml&addressdetails=1&limit="+LIMIT+"&bounded=1&"+viewbox; - log.info(urlq); - URL url = new URL(urlq); //$NON-NLS-1$ - InputStream stream = url.openStream(); - XmlPullParser parser = Xml.newPullParser(); - parser.setInput(stream, "UTF-8"); //$NON-NLS-1$ - int eventType; - int namedDepth= 0; - Amenity a = null; - while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) { - if (eventType == XmlPullParser.START_TAG) { - if (parser.getName().equals("searchresults")) { //$NON-NLS-1$ - String err = parser.getAttributeValue("", "error"); //$NON-NLS-1$ //$NON-NLS-2$ - if (err != null && err.length() > 0) { - lastError = err; - stream.close(); - return searchedAmenities; - } - } - if (parser.getName().equals("place")) { //$NON-NLS-1$ - namedDepth++; - if (namedDepth == 1) { - try { - a = new Amenity(); - a.setLocation(Double.parseDouble(parser.getAttributeValue("", "lat")), //$NON-NLS-1$//$NON-NLS-2$ - Double.parseDouble(parser.getAttributeValue("", "lon"))); //$NON-NLS-1$//$NON-NLS-2$ - a.setId(Long.parseLong(parser.getAttributeValue("", "place_id"))); //$NON-NLS-1$ //$NON-NLS-2$ - String name = parser.getAttributeValue("", "display_name"); //$NON-NLS-1$//$NON-NLS-2$ - a.setName(name); - a.setEnName(Junidecode.unidecode(name)); - a.setType(AmenityType.OTHER); - a.setSubType(parser.getAttributeValue("", "type")); //$NON-NLS-1$//$NON-NLS-2$ - if (matcher == null || matcher.publish(a)) { - searchedAmenities.add(a); - } - } catch (NullPointerException e) { - log.info("Invalid attributes", e); //$NON-NLS-1$ - } catch (NumberFormatException e) { - log.info("Invalid attributes", e); //$NON-NLS-1$ - } - } - } else if (a != null && parser.getName().equals(a.getSubType())) { - if (parser.next() == XmlPullParser.TEXT) { - String name = parser.getText(); - if (name != null) { - a.setName(name); - a.setEnName(Junidecode.unidecode(name)); - } - } - } - } else if (eventType == XmlPullParser.END_TAG) { - if (parser.getName().equals("place")) { //$NON-NLS-1$ - namedDepth--; - if(namedDepth == 0){ - a = null; - } - } - } - } - stream.close(); - } catch (IOException e) { - log.error("Error loading name finder poi", e); //$NON-NLS-1$ - lastError = getApplication().getString(R.string.input_output_error); //$NON-NLS-1$ - } catch (XmlPullParserException e) { - log.error("Error parsing name finder poi", e); //$NON-NLS-1$ - lastError = getApplication().getString(R.string.input_output_error); //$NON-NLS-1$ - } - MapUtils.sortListOfMapObject(searchedAmenities, lat, lon); - return searchedAmenities; - } - - public String getLastError() { - return lastError; - } - - public List getSearchedAmenities() { - return searchedAmenities; - } - - - -} diff --git a/OsmAnd/src/net/osmand/plus/OsmandApplication.java b/OsmAnd/src/net/osmand/plus/OsmandApplication.java index 31ea37a5e4..33ac415640 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandApplication.java +++ b/OsmAnd/src/net/osmand/plus/OsmandApplication.java @@ -27,6 +27,8 @@ import net.osmand.plus.activities.SettingsActivity; import net.osmand.plus.api.ExternalServiceAPI; import net.osmand.plus.api.InternalOsmAndAPI; import net.osmand.plus.api.InternalToDoAPI; +import net.osmand.plus.api.SQLiteAPI; +import net.osmand.plus.api.SQLiteAPIImpl; import net.osmand.plus.api.SettingsAPI; import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.plus.render.RendererRegistry; @@ -87,6 +89,7 @@ public class OsmandApplication extends Application implements ClientContext { ExternalServiceAPI externalServiceAPI; InternalToDoAPI internalToDoAPI; InternalOsmAndAPI internalOsmAndAPI; + SQLiteAPI sqliteAPI; @Override public void onCreate() { @@ -96,6 +99,7 @@ public class OsmandApplication extends Application implements ClientContext { externalServiceAPI = new net.osmand.plus.api.ExternalServiceAPIImpl(this); internalToDoAPI = new net.osmand.plus.api.InternalToDoAPIImpl(this); internalOsmAndAPI = new net.osmand.plus.api.InternalOsmAndAPIImpl(this); + sqliteAPI = new SQLiteAPIImpl(this); osmandSettings = createOsmandSettingsInstance(); @@ -612,4 +616,10 @@ public class OsmandApplication extends Application implements ClientContext { return internalOsmAndAPI; } + @Override + public SQLiteAPI getSQLiteAPI() { + // TODO Auto-generated method stub + return null; + } + } diff --git a/OsmAnd/src/net/osmand/plus/PoiFilter.java b/OsmAnd/src/net/osmand/plus/PoiFilter.java deleted file mode 100644 index edf3dddb2a..0000000000 --- a/OsmAnd/src/net/osmand/plus/PoiFilter.java +++ /dev/null @@ -1,323 +0,0 @@ -package net.osmand.plus; - -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import net.osmand.OsmAndFormatter; -import net.osmand.ResultMatcher; -import net.osmand.data.Amenity; -import net.osmand.data.AmenityType; -import net.osmand.data.IndexConstants; -import net.osmand.osm.MapUtils; - -public class PoiFilter { - - public final static String STD_PREFIX = "std_"; //$NON-NLS-1$ - public final static String USER_PREFIX = "user_"; //$NON-NLS-1$ - public final static String CUSTOM_FILTER_ID = USER_PREFIX + "custom_id"; //$NON-NLS-1$ - public final static String BY_NAME_FILTER_ID = USER_PREFIX + "by_name"; //$NON-NLS-1$ - - private Map> acceptedTypes = new LinkedHashMap>(); - private String filterByName = null; - - protected String filterId; - protected String name; - protected String nameFilter; - protected boolean isStandardFilter; - - protected final OsmandApplication application; - - protected int distanceInd = 1; - // in kilometers - protected double[] distanceToSearchValues = new double[] {1, 2, 3, 5, 10, 30, 100, 250 }; - - - // constructor for standard filters - public PoiFilter(AmenityType type, OsmandApplication application){ - this.application = application; - isStandardFilter = true; - filterId = STD_PREFIX + type; - name = type == null ? application.getString(R.string.poi_filter_closest_poi) : OsmAndFormatter.toPublicString(type, - application); //$NON-NLS-1$ - if(type == null){ - initSearchAll(); - } else { - acceptedTypes.put(type, null); - } - } - - // constructor for user defined filters - public PoiFilter(String name, String filterId, Map> acceptedTypes, OsmandApplication app){ - application = app; - isStandardFilter = false; - if(filterId == null){ - filterId = USER_PREFIX + name.replace(' ', '_').toLowerCase(); - } - this.filterId = filterId; - this.name = name; - if(acceptedTypes == null){ - initSearchAll(); - } else { - this.acceptedTypes.putAll(acceptedTypes); - } - } - - public void setNameFilter(String nameFilter) { - if(nameFilter != null) { - this.nameFilter = nameFilter.toLowerCase(); - } else { - clearNameFilter(); - } - } - - public String getNameFilter() { - return nameFilter; - } - - public void clearNameFilter(){ - nameFilter = null; - } - - private void initSearchAll(){ - for(AmenityType t : AmenityType.values()){ - acceptedTypes.put(t, null); - } - distanceToSearchValues = new double[] {0.5, 1, 2, 3, 5, 10, 15, 30, 100}; - } - - - public boolean isSearchFurtherAvailable(){ - return distanceInd < distanceToSearchValues.length - 1; - } - - - public List searchFurther(double latitude, double longitude, ResultMatcher matcher){ - if(distanceInd < distanceToSearchValues.length - 1){ - distanceInd ++; - } - List amenityList = searchAmenities( latitude, longitude, matcher); - MapUtils.sortListOfMapObject(amenityList, latitude, longitude); - - return amenityList; - } - - public String getSearchArea(){ - double val = distanceToSearchValues[distanceInd]; - if(val >= 1){ - return " < " + ((int) val)+ " " + application.getString(R.string.km); //$NON-NLS-1$//$NON-NLS-2$ - } else { - return " < 500 " + application.getString(R.string.m); //$NON-NLS-1$ - } - } - - public void clearPreviousZoom(){ - distanceInd = 0; - } - - public List initializeNewSearch(double lat, double lon, int firstTimeLimit, ResultMatcher matcher){ - clearPreviousZoom(); - List amenityList = searchAmenities(lat, lon, matcher); - MapUtils.sortListOfMapObject(amenityList, lat, lon); - if (firstTimeLimit > 0) { - while (amenityList.size() > firstTimeLimit) { - amenityList.remove(amenityList.size() - 1); - } - } - return amenityList; - } - - private List searchAmenities(double lat, double lon, ResultMatcher matcher) { - double baseDistY = MapUtils.getDistance(lat, lon, lat - 1, lon); - double baseDistX = MapUtils.getDistance(lat, lon, lat, lon - 1); - double distance = distanceToSearchValues[distanceInd] * 1000; - - double topLatitude = Math.min(lat + (distance/ baseDistY ), 84.); - double bottomLatitude = Math.max(lat - (distance/ baseDistY ), -84.); - double leftLongitude = Math.max(lon - (distance / baseDistX), -180); - double rightLongitude = Math.min(lon + (distance/ baseDistX), 180); - - return searchAmenities(lat, lon, topLatitude, bottomLatitude, leftLongitude, rightLongitude, matcher); - } - - public ResultMatcher getResultMatcher(final ResultMatcher matcher){ - final String filter = nameFilter; - if(filter != null) { - final boolean en = application.getSettings().USE_ENGLISH_NAMES.get(); - return new ResultMatcher() { - @Override - public boolean publish(Amenity object) { - if(!OsmAndFormatter.getPoiStringWithoutType(object, en).toLowerCase().contains(filter) || - (matcher != null && !matcher.publish(object))) { - return false; - } - return true; - } - - @Override - public boolean isCancelled() { - return false || (matcher != null && matcher.isCancelled()); - } - }; - } - return matcher; - } - - protected List searchAmenities(double lat, double lon, double topLatitude, - double bottomLatitude, double leftLongitude, double rightLongitude, final ResultMatcher matcher) { - - return application.getResourceManager().searchAmenities(this, - topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); - } - - public List searchAgain(double lat, double lon) { - List amenityList = searchAmenities(lat, lon, null); - MapUtils.sortListOfMapObject(amenityList, lat, lon); - return amenityList; - } - - public String getName(){ - return name; - } - - /** - * @param type - * @return null if all subtypes are accepted/ empty list if type is not accepted at all - */ - public Set getAcceptedSubtypes(AmenityType type){ - if(!acceptedTypes.containsKey(type)){ - return Collections.emptySet(); - } - return acceptedTypes.get(type); - } - - public boolean isTypeAccepted(AmenityType t){ - return acceptedTypes.containsKey(t); - } - - public boolean acceptTypeSubtype(AmenityType t, String subtype){ - if(!acceptedTypes.containsKey(t)){ - return false; - } - LinkedHashSet set = acceptedTypes.get(t); - if(set == null){ - return true; - } - return set.contains(subtype); - } - - public void clearFilter(){ - acceptedTypes = new LinkedHashMap>(); - } - - public boolean areAllTypesAccepted(){ - if(AmenityType.values().length == acceptedTypes.size()){ - for(AmenityType a : acceptedTypes.keySet()){ - if(acceptedTypes.get(a) != null){ - return false; - } - } - return true; - } - return false; - } - - - public void setTypeToAccept(AmenityType type, boolean accept){ - if(accept){ - acceptedTypes.put(type, new LinkedHashSet()); - } else { - acceptedTypes.remove(type); - } - } - - public void setMapToAccept(Map> newMap) { - Iterator>> iterator = newMap.entrySet().iterator(); - acceptedTypes.clear(); - while(iterator.hasNext()){ - Entry> e = iterator.next(); - if(e.getValue() == null){ - acceptedTypes.put(e.getKey(), null); - } else { - acceptedTypes.put(e.getKey(), new LinkedHashSet(e.getValue())); - } - } - } - - public String buildSqlWhereFilter(){ - if(areAllTypesAccepted()){ - return null; - } - assert IndexConstants.POI_TABLE != null : "use constants here to show table usage "; //$NON-NLS-1$ - if(acceptedTypes.size() == 0){ - return "1 > 1"; //$NON-NLS-1$ - } - StringBuilder b = new StringBuilder(); - b.append("("); //$NON-NLS-1$ - boolean first = true; - for(AmenityType a : acceptedTypes.keySet()){ - if(first){ - first = false; - } else { - b.append(" OR "); //$NON-NLS-1$ - } - b.append("(type = '").append(AmenityType.valueToString(a)).append("'"); //$NON-NLS-1$ //$NON-NLS-2$ - if(acceptedTypes.get(a) != null){ - LinkedHashSet list = acceptedTypes.get(a); - b.append(" AND subtype IN ("); //$NON-NLS-1$ - boolean bfirst = true; - for(String s : list){ - if(bfirst){ - bfirst = false; - } else { - b.append(", "); //$NON-NLS-1$ - } - b.append("'").append(s).append("'"); //$NON-NLS-1$ //$NON-NLS-2$ - } - b.append(")"); //$NON-NLS-1$ - } - b.append(")"); //$NON-NLS-1$ - } - b.append(")"); //$NON-NLS-1$ - return b.toString(); - } - - public Map> getAcceptedTypes(){ - return new LinkedHashMap>(acceptedTypes); - } - - public void selectSubTypesToAccept(AmenityType t, LinkedHashSet accept){ - acceptedTypes.put(t, accept); - } - - public String getFilterId(){ - return filterId; - } - - - public String getFilterByName() { - return filterByName; - } - - public void setFilterByName(String filterByName) { - this.filterByName = filterByName; - } - - public boolean isStandardFilter(){ - return isStandardFilter; - } - - public void setStandardFilter(boolean isStandardFilter) { - this.isStandardFilter = isStandardFilter; - } - - public OsmandApplication getApplication() { - return application; - } - -} diff --git a/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java b/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java deleted file mode 100644 index a011059b83..0000000000 --- a/OsmAnd/src/net/osmand/plus/PoiFiltersHelper.java +++ /dev/null @@ -1,455 +0,0 @@ -package net.osmand.plus; - - -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; - -import net.osmand.data.AmenityType; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteStatement; - -public class PoiFiltersHelper { - private final OsmandApplication application; - - private NameFinderPoiFilter nameFinderPOIFilter; - private List cacheUserDefinedFilters; - private List cacheOsmDefinedFilters; - - private static final String UDF_CAR_AID = "car_aid"; - private static final String UDF_FOR_TOURISTS = "for_tourists"; - private static final String UDF_FOOD_SHOP = "food_shop"; - private static final String UDF_FUEL = "fuel"; - private static final String UDF_SIGHTSEEING = "sightseeing"; - private static final String UDF_EMERGENCY = "emergency"; - private static final String UDF_PUBLIC_TRANSPORT = "public_transport"; - private static final String UDF_ENTERTAINMENT = "entertainment"; - private static final String UDF_ACCOMODATION = "accomodation"; - private static final String UDF_RESTAURANTS = "restaurants"; - private static final String UDF_PARKING = "parking"; - - private static final String[] DEL = new String[] {}; - - public PoiFiltersHelper(OsmandApplication application){ - this.application = application; - } - public NameFinderPoiFilter getNameFinderPOIFilter() { - if(nameFinderPOIFilter == null){ - nameFinderPOIFilter = new NameFinderPoiFilter(application); - } - return nameFinderPOIFilter; - } - - - public PoiFilter getFilterById(String filterId){ - if(filterId == null){ - return null; - } - if(filterId.equals(NameFinderPoiFilter.FILTER_ID)){ - return getNameFinderPOIFilter(); - } - if(filterId.startsWith(PoiFilter.USER_PREFIX)){ - List filters = getUserDefinedPoiFilters(); - for(PoiFilter f : filters){ - if(f.getFilterId().equals(filterId)){ - return f; - } - } - } else if(filterId.startsWith(PoiFilter.STD_PREFIX)){ - List filters = getOsmDefinedPoiFilters(); - for(PoiFilter f : filters){ - if(f.getFilterId().equals(filterId)){ - return f; - } - } - } - return null; - } - - private void putAll(Map> types, AmenityType tp){ - types.put(tp, null); - } - - private void putValues(Map> types, AmenityType tp,String... vls){ - LinkedHashSet list = new LinkedHashSet(); - for(String v: vls){ - list.add(v); - } - types.put(tp, list); - } - - private List getUserDefinedDefaultFilters() { - List filters = new ArrayList(); - filters.add(new PoiFilter(application.getString(R.string.poi_filter_car_aid), PoiFilter.USER_PREFIX + UDF_CAR_AID, - configureDefaultUserDefinedFilter(null, UDF_CAR_AID), application)); - filters.add(new PoiFilter(application.getString(R.string.poi_filter_for_tourists), PoiFilter.USER_PREFIX + UDF_FOR_TOURISTS, - configureDefaultUserDefinedFilter(null, UDF_FOR_TOURISTS), application)); - filters.add(new PoiFilter(application.getString(R.string.poi_filter_fuel), PoiFilter.USER_PREFIX + UDF_FUEL, - configureDefaultUserDefinedFilter(null, UDF_FUEL), application)); - filters.add(new PoiFilter(application.getString(R.string.poi_filter_food_shop), PoiFilter.USER_PREFIX + UDF_FOOD_SHOP, - configureDefaultUserDefinedFilter(null, UDF_FOOD_SHOP), application)); - filters.add(new PoiFilter(application.getString(R.string.poi_filter_sightseeing), PoiFilter.USER_PREFIX + UDF_SIGHTSEEING, - configureDefaultUserDefinedFilter(null, UDF_SIGHTSEEING), application)); - - // UDF_EMERGENCY = "emergency"; - // UDF_ENTERTAINMENT = "entertainment"; - filters.add(new PoiFilter(application.getString(R.string.poi_filter_accomodation), PoiFilter.USER_PREFIX + UDF_ACCOMODATION, - configureDefaultUserDefinedFilter(null, UDF_ACCOMODATION), application)); - filters.add(new PoiFilter(application.getString(R.string.poi_filter_restaurants), PoiFilter.USER_PREFIX + UDF_RESTAURANTS, - configureDefaultUserDefinedFilter(null, UDF_RESTAURANTS), application)); - filters.add(new PoiFilter(application.getString(R.string.poi_filter_public_transport), - PoiFilter.USER_PREFIX + UDF_PUBLIC_TRANSPORT, configureDefaultUserDefinedFilter(null, UDF_PUBLIC_TRANSPORT), application)); - filters.add(new PoiFilter(application.getString(R.string.poi_filter_parking), PoiFilter.USER_PREFIX + UDF_PARKING, - configureDefaultUserDefinedFilter(null, UDF_PARKING), application)); - return filters; - } - - private Map> configureDefaultUserDefinedFilter(Map> types, String key) { - if(types == null) { - types = new LinkedHashMap>(); - } - if(UDF_CAR_AID.equals(key)){ - putValues(types, AmenityType.TRANSPORTATION, "fuel", "car_wash", "car_repair","car", "car_sharing"); - putValues(types, AmenityType.SHOP, "fuel", "car_wash", "car_repair","car", "car_parts"); - } else if(UDF_SIGHTSEEING.equals(key)){ - putAll(types, AmenityType.HISTORIC); - putAll(types, AmenityType.TOURISM); - putAll(types, AmenityType.OSMWIKI); - putValues(types, AmenityType.OTHER, "place_of_worship"); - } else if(UDF_FOR_TOURISTS.equals(key)){ - putAll(types, AmenityType.HISTORIC); - putAll(types, AmenityType.TOURISM); - putAll(types, AmenityType.FINANCE); - putAll(types, AmenityType.OSMWIKI); - putValues(types, AmenityType.OTHER, "place_of_worship", "internet_access_wlan", "internet_access_wired", - "internet_access_terminal", "internet_access_public", "internet_access_service", - "embassy","emergency_phone","marketplace", - "post_office","telephone", "toilets"); - } else if(UDF_FUEL.equals(key)){ - putValues(types, AmenityType.TRANSPORTATION, "fuel"); - } else if (UDF_FOOD_SHOP.equals(key)) { - putValues(types, AmenityType.SHOP, "alcohol", "bakery", "beverages", "butcher", "convenience", "department_store", - "convenience", "farm", "general", "ice_cream", "kiosk", "supermarket", "variety_store"); - } else if (UDF_SIGHTSEEING.equals(key)) { - putAll(types, AmenityType.HISTORIC); - putValues(types, AmenityType.TOURISM, "attraction", - "artwork","zoo","theme_park", "museum","viewpoint"); - putValues(types, AmenityType.OTHER, "place_of_worship"); - } else if (UDF_ACCOMODATION.equals(key)) { - putValues(types, AmenityType.TOURISM, "camp_site", - "caravan_site","picnic_site","alpine_hut", "chalet","guest_house", - "hostel", "hotel","motel"); - } else if (UDF_PARKING.equals(key)) { - putValues(types, AmenityType.TRANSPORTATION, "parking", - "bicycle_parking"); - } else if (UDF_PUBLIC_TRANSPORT.equals(key)) { - putValues(types, AmenityType.TRANSPORTATION, "public_transport_stop_position", "public_transport_platform", - "public_transport_station", - // railway - "railway_platform", "railway_station", "halt", "tram_stop", "subway_entrance", "railway_buffer_stop", - // bus, cars, bicycle - "bus_stop", "platform", "ferry_terminal", "taxi", "bicycle_rental", "bus_station", "car_rental", "car_sharing", - // aero - "airport", "aerodrome", "terminal", "gate", - // aerial ways ( hide ways) - // "aerialway_cable_car", "aerialway_gondola", "aerialway_chair_lift", "aerialway_mixed_lift", "aerialway_drag_lift", "aerialway_goods", - "aerialway_station" - // ways (hide ways) - // "rail", "tram", "light_rail", "subway", "railway_narrow_gauge", "railway_monorail", "railway_funicular" - ); - } else if (UDF_RESTAURANTS.equals(key)) { - putValues(types, AmenityType.SUSTENANCE, "restaurant", - "cafe", "food_court", "fast_food", "pub", "bar", "biergarten"); - } else if (UDF_EMERGENCY.equals(key)) { - putAll(types, AmenityType.HEALTHCARE); - putAll(types, AmenityType.EMERGENCY); - } else if (UDF_ENTERTAINMENT.equals(key)) { - putAll(types, AmenityType.ENTERTAINMENT); - } - - return types; - } - - - public List getUserDefinedPoiFilters(){ - if(cacheUserDefinedFilters == null){ - cacheUserDefinedFilters = new ArrayList(); - PoiFilter filter = new PoiFilter(application.getString(R.string.poi_filter_custom_filter), PoiFilter.CUSTOM_FILTER_ID, - new LinkedHashMap>(), application); //$NON-NLS-1$ - filter.setStandardFilter(true); - cacheUserDefinedFilters.add(filter); - filter = new SearchByNameFilter(application); - cacheUserDefinedFilters.add(filter); - PoiFilterDbHelper helper = openDbHelper(); - List userDefined = helper.getFilters(helper.getReadableDatabase()); - final Collator instance = Collator.getInstance(); - Collections.sort(userDefined, new Comparator() { - @Override - public int compare(PoiFilter object1, PoiFilter object2) { - return instance.compare(object1.getName(), object2.getName()); - } - }); - cacheUserDefinedFilters.addAll(userDefined); - helper.close(); - } - return Collections.unmodifiableList(cacheUserDefinedFilters); - } - - public static String getOsmDefinedFilterId(AmenityType t){ - return PoiFilter.STD_PREFIX + t; - } - - public void updateFilters(boolean onlyAddFilters){ - PoiFilterDbHelper helper = openDbHelper(); - helper.upgradeFilters(helper.getWritableDatabase(), onlyAddFilters); - helper.close(); - } - - - public List getOsmDefinedPoiFilters(){ - if(cacheOsmDefinedFilters == null){ - cacheOsmDefinedFilters = new ArrayList(); - for(AmenityType t : AmenityType.values()){ - cacheOsmDefinedFilters.add(new PoiFilter(t, application)); - } - final Collator instance = Collator.getInstance(); - Collections.sort(cacheOsmDefinedFilters, new Comparator() { - @Override - public int compare(PoiFilter object1, PoiFilter object2) { - return instance.compare(object1.getName(), object2.getName()); - } - }); - cacheOsmDefinedFilters.add(0, new PoiFilter(null, application)); - } - return Collections.unmodifiableList(cacheOsmDefinedFilters); - } - - private PoiFilterDbHelper openDbHelper(){ - return new PoiFilterDbHelper(application.getApplicationContext()); - } - - public boolean removePoiFilter(PoiFilter filter){ - if(filter.getFilterId().equals(PoiFilter.CUSTOM_FILTER_ID) || - filter.getFilterId().equals(PoiFilter.BY_NAME_FILTER_ID)){ - return false; - } - PoiFilterDbHelper helper = openDbHelper(); - if(helper == null){ - return false; - } - boolean res = helper.deleteFilter(helper.getWritableDatabase(), filter); - if(res){ - cacheUserDefinedFilters.remove(filter); - } - helper.close(); - return res; - } - - public boolean createPoiFilter(PoiFilter filter){ - PoiFilterDbHelper helper = openDbHelper(); - if(helper == null){ - return false; - } - boolean res = helper.addFilter(filter, helper.getWritableDatabase(), false); - if(res){ - cacheUserDefinedFilters.add(filter); - } - helper.close(); - return res; - } - - - - public boolean editPoiFilter(PoiFilter filter) { - if (filter.getFilterId().equals(PoiFilter.CUSTOM_FILTER_ID) || - filter.getFilterId().equals(PoiFilter.BY_NAME_FILTER_ID)) { - return false; - } - PoiFilterDbHelper helper = openDbHelper(); - if (helper != null) { - boolean res = helper.editFilter(helper.getWritableDatabase(), filter); - helper.close(); - return res; - } - return false; - } - - - public class PoiFilterDbHelper extends SQLiteOpenHelper { - - public static final String DATABASE_NAME = "poi_filters"; //$NON-NLS-1$ - private static final int DATABASE_VERSION = 2; - private static final String FILTER_NAME = "poi_filters"; //$NON-NLS-1$ - private static final String FILTER_COL_NAME = "name"; //$NON-NLS-1$ - private static final String FILTER_COL_ID = "id"; //$NON-NLS-1$ - private static final String FILTER_COL_FILTERBYNAME = "filterbyname"; //$NON-NLS-1$ - private static final String FILTER_TABLE_CREATE = "CREATE TABLE " + FILTER_NAME + " (" + //$NON-NLS-1$ //$NON-NLS-2$ - FILTER_COL_NAME + ", " + FILTER_COL_ID + ", " + FILTER_COL_FILTERBYNAME + ");"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - - private static final String CATEGORIES_NAME = "categories"; //$NON-NLS-1$ - private static final String CATEGORIES_FILTER_ID = "filter_id"; //$NON-NLS-1$ - private static final String CATEGORIES_COL_CATEGORY = "category"; //$NON-NLS-1$ - private static final String CATEGORIES_COL_SUBCATEGORY = "subcategory"; //$NON-NLS-1$ - private static final String CATEGORIES_TABLE_CREATE = "CREATE TABLE " + CATEGORIES_NAME + " (" + //$NON-NLS-1$ //$NON-NLS-2$ - CATEGORIES_FILTER_ID + ", " + CATEGORIES_COL_CATEGORY + ", " + CATEGORIES_COL_SUBCATEGORY + ");"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - PoiFilterDbHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL(FILTER_TABLE_CREATE); - db.execSQL(CATEGORIES_TABLE_CREATE); - upgradeFilters(db, true); - } - - public void upgradeFilters(SQLiteDatabase db, boolean onlyAdd) { - List filters = PoiFilterDbHelper.this.getFilters(db); - List def = getUserDefinedDefaultFilters(); - for(PoiFilter f : filters){ - PoiFilter std = null; - for(PoiFilter d : def){ - if(f.getFilterId().equals(d.getFilterId())){ - std = d; - break; - } - } - for(String toDel : DEL) { - if(f.getFilterId().equals(toDel)) { - deleteFilter(db, f); - } - } - if(std != null){ - if(!onlyAdd){ - editFilter(db, std); - } else { - updateName(db, std); - } - def.remove(std); - } - } - for(PoiFilter d : def){ - addFilter(d, db, false); - } - } - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - if (newVersion == 2 || newVersion == 3) { - upgradeFilters(db, false); - } else { - upgradeFilters(db, true); - } - } - - protected boolean addFilter(PoiFilter p, SQLiteDatabase db, boolean addOnlyCategories){ - if(db != null){ - if(!addOnlyCategories){ - db.execSQL("INSERT INTO " + FILTER_NAME + " VALUES (?, ?, ?)",new Object[]{p.getName(), p.getFilterId(), p.getFilterByName()}); //$NON-NLS-1$ //$NON-NLS-2$ - } - Map> types = p.getAcceptedTypes(); - SQLiteStatement insertCategories = db.compileStatement("INSERT INTO " + CATEGORIES_NAME + " VALUES (?, ?, ?)"); //$NON-NLS-1$ //$NON-NLS-2$ - for(AmenityType a : types.keySet()){ - if(types.get(a) == null){ - insertCategories.bindString(1, p.getFilterId()); - insertCategories.bindString(2, AmenityType.valueToString(a)); - insertCategories.bindNull(3); - insertCategories.execute(); - } else { - for(String s : types.get(a)){ - insertCategories.bindString(1, p.getFilterId()); - insertCategories.bindString(2, AmenityType.valueToString(a)); - insertCategories.bindString(3, s); - insertCategories.execute(); - } - } - } - insertCategories.close(); - return true; - } - return false; - } - - protected List getFilters(SQLiteDatabase db){ - ArrayList list = new ArrayList(); - if(db != null){ - Cursor query = db.rawQuery("SELECT " + CATEGORIES_FILTER_ID +", " + CATEGORIES_COL_CATEGORY +"," + CATEGORIES_COL_SUBCATEGORY +" FROM " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - CATEGORIES_NAME, null); - Map>> map = new LinkedHashMap>>(); - if(query.moveToFirst()){ - do { - String filterId = query.getString(0); - if(!map.containsKey(filterId)){ - map.put(filterId, new LinkedHashMap>()); - } - Map> m = map.get(filterId); - AmenityType a = AmenityType.fromString(query.getString(1)); - String subCategory = query.getString(2); - if(subCategory == null){ - m.put(a, null); - } else { - if(m.get(a) == null){ - m.put(a, new LinkedHashSet()); - } - m.get(a).add(subCategory); - } - } while(query.moveToNext()); - } - query.close(); - - query = db.rawQuery("SELECT " + FILTER_COL_ID +", " + FILTER_COL_NAME +"," + FILTER_COL_FILTERBYNAME +" FROM " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - FILTER_NAME, null); - if(query.moveToFirst()){ - do { - String filterId = query.getString(0); - if(map.containsKey(filterId)){ - PoiFilter filter = new PoiFilter(query.getString(1), filterId, map.get(filterId), application); - filter.setFilterByName(query.getString(2)); - list.add(filter); - } - } while(query.moveToNext()); - } - query.close(); - } - return list; - } - - protected boolean editFilter(SQLiteDatabase db, PoiFilter filter) { - if (db != null) { - db.execSQL("DELETE FROM " + CATEGORIES_NAME + " WHERE " + CATEGORIES_FILTER_ID + " = ?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - new Object[] { filter.getFilterId() }); - addFilter(filter, db, true); - updateName(db, filter); - return true; - } - return false; - } - - private void updateName(SQLiteDatabase db, PoiFilter filter) { - db.execSQL("UPDATE " + FILTER_NAME + " SET " + FILTER_COL_FILTERBYNAME + " = ?, " + FILTER_COL_NAME + " = ? " + " WHERE " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - + FILTER_COL_ID + "= ?", new Object[] { filter.getFilterByName(), filter.getName(), filter.getFilterId() }); //$NON-NLS-1$ - } - - protected boolean deleteFilter(SQLiteDatabase db, PoiFilter p){ - if(db != null){ - db.execSQL("DELETE FROM " + FILTER_NAME + " WHERE " +FILTER_COL_ID + " = ?",new Object[]{p.getFilterId()}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - db.execSQL("DELETE FROM " + CATEGORIES_NAME + " WHERE " +CATEGORIES_FILTER_ID + " = ?", new Object[]{p.getFilterId()}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - return true; - } - return false; - } - - - - } - -} diff --git a/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java b/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java deleted file mode 100644 index ad4ea31b2b..0000000000 --- a/OsmAnd/src/net/osmand/plus/SearchByNameFilter.java +++ /dev/null @@ -1,79 +0,0 @@ -package net.osmand.plus; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; - -import net.osmand.ResultMatcher; -import net.osmand.data.Amenity; -import net.osmand.data.AmenityType; -import net.osmand.osm.MapUtils; - -public class SearchByNameFilter extends PoiFilter { - - public static final String FILTER_ID = PoiFilter.BY_NAME_FILTER_ID; //$NON-NLS-1$ - - List searchedAmenities = new ArrayList(); - - private String query = ""; //$NON-NLS-1$ - - public SearchByNameFilter(OsmandApplication application) { - super(application.getString(R.string.poi_filter_by_name), FILTER_ID, new LinkedHashMap>(), application); - this.distanceToSearchValues = new double[] {100, 1000, 5000}; - this.isStandardFilter = true; - } - - @Override - public List searchAgain(double lat, double lon) { - MapUtils.sortListOfMapObject(searchedAmenities, lat, lon); - return searchedAmenities; - } - - public String getQuery() { - return query; - } - - public void setQuery(String query) { - this.query = query; - } - - @Override - protected List searchAmenities(double lat, double lon, double topLatitude, - double bottomLatitude, double leftLongitude, double rightLongitude, final ResultMatcher matcher) { - searchedAmenities.clear(); - final int limit = distanceInd == 0 ? 500 : -1; - - List result = application.getResourceManager().searchAmenitiesByName(query, - topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, new ResultMatcher() { - boolean elimit = false; - @Override - public boolean publish(Amenity object) { - if(limit != -1 && searchedAmenities.size() > limit) { - elimit = true; - } - if(matcher.publish(object)) { - searchedAmenities.add(object); - return true; - } - return false; - } - - @Override - public boolean isCancelled() { - return matcher.isCancelled() || elimit; - } - }); - MapUtils.sortListOfMapObject(result, lat, lon); - searchedAmenities = result; - return searchedAmenities; - } - - - public List getSearchedAmenities() { - return searchedAmenities; - } - - - -} diff --git a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java index cc08eb1ba7..6da372bc62 100644 --- a/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java +++ b/OsmAnd/src/net/osmand/plus/api/InternalOsmAndAPIImpl.java @@ -3,10 +3,14 @@ package net.osmand.plus.api; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.List; import net.osmand.NativeLibrary; +import net.osmand.ResultMatcher; import net.osmand.access.AccessibilityMode; +import net.osmand.data.Amenity; import net.osmand.plus.OsmandApplication; +import net.osmand.plus.PoiFilter; import net.osmand.plus.ResourceManager; import net.osmand.plus.render.NativeOsmandLibrary; @@ -74,5 +78,17 @@ public class InternalOsmAndAPIImpl implements InternalOsmAndAPI { return ((AccessibilityManager) app.getSystemService(Context.ACCESSIBILITY_SERVICE)).isEnabled(); } + @Override + public List searchAmenities(PoiFilter filter, double topLatitude, double leftLongitude, double bottomLatitude, + double rightLongitude, double lat, double lon, ResultMatcher matcher) { + return app.getResourceManager().searchAmenities(filter, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); + } + + @Override + public List searchAmenitiesByName(String searchQuery, double topLatitude, double leftLongitude, double bottomLatitude, + double rightLongitude, double lat, double lon, ResultMatcher matcher) { + return app.getResourceManager().searchAmenitiesByName(searchQuery, topLatitude, leftLongitude, bottomLatitude, rightLongitude, lat, lon, matcher); + } + } diff --git a/OsmAnd/src/net/osmand/plus/api/SQLiteAPIImpl.java b/OsmAnd/src/net/osmand/plus/api/SQLiteAPIImpl.java new file mode 100644 index 0000000000..63e9b3d7cc --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/api/SQLiteAPIImpl.java @@ -0,0 +1,124 @@ +package net.osmand.plus.api; + +import net.osmand.plus.OsmandApplication; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +public class SQLiteAPIImpl implements SQLiteAPI { + + private OsmandApplication app; + + public SQLiteAPIImpl(OsmandApplication app) { + this.app = app; + } + + @Override + public SQLiteConnection getOrCreateDatabase(String name, boolean readOnly) { + android.database.sqlite.SQLiteDatabase db = app.openOrCreateDatabase(name, + readOnly? SQLiteDatabase.OPEN_READONLY : SQLiteDatabase.OPEN_READWRITE, null); + if(db == null) { + return null; + } + return new SQLiteDatabaseWrapper(db) ; + } + + + public class SQLiteDatabaseWrapper implements SQLiteConnection { + android.database.sqlite.SQLiteDatabase ds; + + + public SQLiteDatabaseWrapper(android.database.sqlite.SQLiteDatabase ds) { + super(); + this.ds = ds; + } + + @Override + public int getVersion() { + return ds.getVersion(); + } + + @Override + public void close() { + ds.close(); + + } + + @Override + public SQLiteCursor rawQuery(String sql, String[] selectionArgs) { + final Cursor c = ds.rawQuery(sql, selectionArgs); + if(c == null) { + return null; + } + return new SQLiteCursor() { + + @Override + public boolean moveToNext() { + return c.moveToNext(); + } + + @Override + public boolean moveToFirst() { + return c.moveToFirst(); + } + + @Override + public String getString(int ind) { + return c.getString(ind); + } + + @Override + public void close() { + c.close(); + } + }; + } + + @Override + public void execSQL(String query) { + ds.execSQL(query); + } + + @Override + public void execSQL(String query, Object[] objects) { + ds.execSQL(query, objects); + } + + @Override + public SQLiteStatement compileStatement(String query) { + final android.database.sqlite.SQLiteStatement st = ds.compileStatement(query); + if(st == null) { + return null; + } + return new SQLiteStatement() { + + @Override + public void execute() { + st.execute(); + + } + + @Override + public void close() { + st.close(); + } + + @Override + public void bindString(int i, String value) { + st.bindString(i, value); + + } + + @Override + public void bindNull(int i) { + st.bindNull(i); + } + }; + } + + @Override + public void setVersion(int newVersion) { + ds.setVersion(newVersion); + } + + } +}