Merge pull request #8918 from osmandapp/create_custom_poi
custom poi types cache db
This commit is contained in:
commit
392d69dd66
10 changed files with 251 additions and 64 deletions
|
@ -1424,7 +1424,7 @@ public class BinaryMapIndexReader {
|
||||||
return addressIndexes;
|
return addressIndexes;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<PoiRegion> getPoiIndexes() {
|
public List<PoiRegion> getPoiIndexes() {
|
||||||
return poiIndexes;
|
return poiIndexes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -229,17 +229,7 @@ public class BinaryMapPoiReaderAdapter {
|
||||||
region.subcategories.add(new ArrayList<String>());
|
region.subcategories.add(new ArrayList<String>());
|
||||||
break;
|
break;
|
||||||
case OsmandOdb.OsmAndCategoryTable.SUBCATEGORIES_FIELD_NUMBER:
|
case OsmandOdb.OsmAndCategoryTable.SUBCATEGORIES_FIELD_NUMBER:
|
||||||
String subCat = codedIS.readString().intern();
|
region.subcategories.get(region.subcategories.size() - 1).add(codedIS.readString().intern());
|
||||||
PoiCategory lastCat = poiTypes.getPoiCategoryByName(region.categories.get(region.categories.size() - 1));
|
|
||||||
PoiType poiType = new PoiType(MapPoiTypes.getDefault(), lastCat, null, subCat);
|
|
||||||
List<String> filters = new ArrayList<>();
|
|
||||||
for (PoiType poi : lastCat.getPoiTypes()) {
|
|
||||||
filters.add(poi.getKeyName());
|
|
||||||
}
|
|
||||||
if (!filters.contains(subCat)) {
|
|
||||||
lastCat.getPoiTypes().add(poiType);
|
|
||||||
}
|
|
||||||
region.subcategories.get(region.subcategories.size() - 1).add(subCat);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
skipUnknownField(t);
|
skipUnknownField(t);
|
||||||
|
|
|
@ -918,11 +918,4 @@ public class MapPoiTypes {
|
||||||
return pat.isText();
|
return pat.isText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,5 +69,5 @@ public class PoiFilter extends AbstractPoiType {
|
||||||
public List<PoiType> getPoiTypes() {
|
public List<PoiType> getPoiTypes() {
|
||||||
return poiTypes;
|
return poiTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ import net.osmand.IProgress;
|
||||||
import net.osmand.IndexConstants;
|
import net.osmand.IndexConstants;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.aidl.OsmandAidlApi;
|
import net.osmand.aidl.OsmandAidlApi;
|
||||||
import net.osmand.binary.BinaryMapIndexReader;
|
|
||||||
import net.osmand.map.OsmandRegions;
|
import net.osmand.map.OsmandRegions;
|
||||||
import net.osmand.map.OsmandRegions.RegionTranslation;
|
import net.osmand.map.OsmandRegions.RegionTranslation;
|
||||||
import net.osmand.map.WorldRegion;
|
import net.osmand.map.WorldRegion;
|
||||||
|
@ -406,17 +405,6 @@ public class AppInitializer implements IProgress {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void readPoiTypesFromMap() {
|
|
||||||
final BinaryMapIndexReader[] currentFile = app.resourceManager.getPoiSearchFiles();
|
|
||||||
for (BinaryMapIndexReader r : currentFile) {
|
|
||||||
try {
|
|
||||||
r.initCategories();
|
|
||||||
} catch (IOException e) {
|
|
||||||
LOG.error("Error while read poi types from map " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onCreateApplication() {
|
public void onCreateApplication() {
|
||||||
// always update application mode to default
|
// always update application mode to default
|
||||||
OsmandSettings osmandSettings = app.getSettings();
|
OsmandSettings osmandSettings = app.getSettings();
|
||||||
|
@ -667,7 +655,6 @@ public class AppInitializer implements IProgress {
|
||||||
initPoiTypes();
|
initPoiTypes();
|
||||||
notifyEvent(InitEvents.POI_TYPES_INITIALIZED);
|
notifyEvent(InitEvents.POI_TYPES_INITIALIZED);
|
||||||
app.resourceManager.reloadIndexesOnStart(this, warnings);
|
app.resourceManager.reloadIndexesOnStart(this, warnings);
|
||||||
readPoiTypesFromMap();
|
|
||||||
|
|
||||||
// native depends on renderers
|
// native depends on renderers
|
||||||
initNativeCore();
|
initNativeCore();
|
||||||
|
|
|
@ -333,7 +333,6 @@ public class OsmandApplication extends MultiDexApplication {
|
||||||
return poiFilters;
|
return poiFilters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public GpxSelectionHelper getSelectedGpxHelper() {
|
public GpxSelectionHelper getSelectedGpxHelper() {
|
||||||
return selectedGpxHelper;
|
return selectedGpxHelper;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,10 @@ package net.osmand.plus.poi;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.core.util.Pair;
|
||||||
|
|
||||||
|
import net.osmand.PlatformUtil;
|
||||||
import net.osmand.osm.AbstractPoiType;
|
import net.osmand.osm.AbstractPoiType;
|
||||||
import net.osmand.osm.MapPoiTypes;
|
import net.osmand.osm.MapPoiTypes;
|
||||||
import net.osmand.osm.PoiCategory;
|
import net.osmand.osm.PoiCategory;
|
||||||
|
@ -12,12 +15,18 @@ import net.osmand.plus.ApplicationMode;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.OsmandSettings;
|
import net.osmand.plus.OsmandSettings;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.api.SQLiteAPI;
|
||||||
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
|
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
|
||||||
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
|
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
|
||||||
import net.osmand.plus.api.SQLiteAPI.SQLiteStatement;
|
import net.osmand.plus.api.SQLiteAPI.SQLiteStatement;
|
||||||
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
|
import net.osmand.plus.wikipedia.WikipediaPoiMenu;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -36,6 +45,7 @@ import static net.osmand.osm.MapPoiTypes.WIKI_PLACE;
|
||||||
|
|
||||||
public class PoiFiltersHelper {
|
public class PoiFiltersHelper {
|
||||||
|
|
||||||
|
private static final Log LOG = PlatformUtil.getLog(PoiFiltersHelper.class);
|
||||||
private final OsmandApplication application;
|
private final OsmandApplication application;
|
||||||
|
|
||||||
private NominatimPoiFilter nominatimPOIFilter;
|
private NominatimPoiFilter nominatimPOIFilter;
|
||||||
|
@ -625,6 +635,33 @@ public class PoiFiltersHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Pair<Long, Map<String, List<String>>> getCacheByResourceName(String fileName) {
|
||||||
|
Pair<Long, Map<String, List<String>>> cache = null;
|
||||||
|
PoiFilterDbHelper helper = openDbHelper();
|
||||||
|
if (helper != null) {
|
||||||
|
cache = helper.getCacheByResourceName(helper.getReadableDatabase(), fileName);
|
||||||
|
helper.close();
|
||||||
|
}
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateCacheForResource(String fileName, long lastModified, Map<String, List<String>> categories) {
|
||||||
|
PoiFilterDbHelper helper = openDbHelper();
|
||||||
|
if (helper != null) {
|
||||||
|
helper.updateCacheForResource(helper.getReadableDatabase(), fileName, lastModified, categories);
|
||||||
|
helper.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertCacheForResource(String fileName, long lastModified, Map<String, List<String>> categories) {
|
||||||
|
PoiFilterDbHelper helper = openDbHelper();
|
||||||
|
if (helper != null) {
|
||||||
|
helper.insertCacheForResource(helper.getReadableDatabase(), fileName, lastModified, categories);
|
||||||
|
helper.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void saveSelectedPoiFilters() {
|
private void saveSelectedPoiFilters() {
|
||||||
Set<String> filters = new HashSet<>();
|
Set<String> filters = new HashSet<>();
|
||||||
for (Set<PoiUIFilter> template : selectedPoiFilters.values()) {
|
for (Set<PoiUIFilter> template : selectedPoiFilters.values()) {
|
||||||
|
@ -641,7 +678,7 @@ public class PoiFiltersHelper {
|
||||||
private static final int FALSE_INT = 0;
|
private static final int FALSE_INT = 0;
|
||||||
|
|
||||||
public static final String DATABASE_NAME = "poi_filters";
|
public static final String DATABASE_NAME = "poi_filters";
|
||||||
private static final int DATABASE_VERSION = 6;
|
private static final int DATABASE_VERSION = 7;
|
||||||
|
|
||||||
private static final String FILTER_NAME = "poi_filters";
|
private static final String FILTER_NAME = "poi_filters";
|
||||||
private static final String FILTER_COL_NAME = "name";
|
private static final String FILTER_COL_NAME = "name";
|
||||||
|
@ -669,6 +706,20 @@ public class PoiFiltersHelper {
|
||||||
CATEGORIES_COL_CATEGORY + ", " +
|
CATEGORIES_COL_CATEGORY + ", " +
|
||||||
CATEGORIES_COL_SUBCATEGORY + ");";
|
CATEGORIES_COL_SUBCATEGORY + ");";
|
||||||
|
|
||||||
|
private static final String POI_TYPES_CACHE_NAME = "poi_types_cache";
|
||||||
|
private static final String MAP_FILE_NAME = "map_name";
|
||||||
|
private static final String MAP_FILE_DATE = "map_date";
|
||||||
|
private static final String CACHED_POI_CATEGORIES = "cached_categories";
|
||||||
|
|
||||||
|
private static final String POI_CACHE_TABLE_CREATE = "CREATE TABLE " +
|
||||||
|
POI_TYPES_CACHE_NAME + " (" +
|
||||||
|
MAP_FILE_NAME + ", " +
|
||||||
|
MAP_FILE_DATE + ", " +
|
||||||
|
CACHED_POI_CATEGORIES + ");";
|
||||||
|
|
||||||
|
private static final String CATEGORY_KEY = "category";
|
||||||
|
private static final String SUB_CATEGORIES_KEY = "sub_categories";
|
||||||
|
|
||||||
private OsmandApplication context;
|
private OsmandApplication context;
|
||||||
private SQLiteConnection conn;
|
private SQLiteConnection conn;
|
||||||
private MapPoiTypes mapPoiTypes;
|
private MapPoiTypes mapPoiTypes;
|
||||||
|
@ -714,6 +765,7 @@ public class PoiFiltersHelper {
|
||||||
public void onCreate(SQLiteConnection conn) {
|
public void onCreate(SQLiteConnection conn) {
|
||||||
conn.execSQL(FILTER_TABLE_CREATE);
|
conn.execSQL(FILTER_TABLE_CREATE);
|
||||||
conn.execSQL(CATEGORIES_TABLE_CREATE);
|
conn.execSQL(CATEGORIES_TABLE_CREATE);
|
||||||
|
conn.execSQL(POI_CACHE_TABLE_CREATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -725,6 +777,9 @@ public class PoiFiltersHelper {
|
||||||
conn.execSQL("ALTER TABLE " + FILTER_NAME + " ADD " + FILTER_COL_HISTORY + " int DEFAULT " + FALSE_INT);
|
conn.execSQL("ALTER TABLE " + FILTER_NAME + " ADD " + FILTER_COL_HISTORY + " int DEFAULT " + FALSE_INT);
|
||||||
conn.execSQL("ALTER TABLE " + FILTER_NAME + " ADD " + FILTER_COL_DELETED + " int DEFAULT " + FALSE_INT);
|
conn.execSQL("ALTER TABLE " + FILTER_NAME + " ADD " + FILTER_COL_DELETED + " int DEFAULT " + FALSE_INT);
|
||||||
}
|
}
|
||||||
|
if (oldVersion < 7) {
|
||||||
|
conn.execSQL(POI_CACHE_TABLE_CREATE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteOldFilters(SQLiteConnection conn) {
|
private void deleteOldFilters(SQLiteConnection conn) {
|
||||||
|
@ -887,5 +942,89 @@ public class PoiFiltersHelper {
|
||||||
db.execSQL("DELETE FROM " + FILTER_NAME + " WHERE " + FILTER_COL_ID + " = ?", new Object[]{key});
|
db.execSQL("DELETE FROM " + FILTER_NAME + " WHERE " + FILTER_COL_ID + " = ?", new Object[]{key});
|
||||||
db.execSQL("DELETE FROM " + CATEGORIES_NAME + " WHERE " + CATEGORIES_FILTER_ID + " = ?", new Object[]{key});
|
db.execSQL("DELETE FROM " + CATEGORIES_NAME + " WHERE " + CATEGORIES_FILTER_ID + " = ?", new Object[]{key});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
protected Pair<Long, Map<String, List<String>>> getCacheByResourceName(SQLiteConnection db, String fileName) {
|
||||||
|
Pair<Long, Map<String, List<String>>> cache = null;
|
||||||
|
if (db != null) {
|
||||||
|
SQLiteAPI.SQLiteCursor query = db.rawQuery("SELECT " +
|
||||||
|
MAP_FILE_DATE + ", " +
|
||||||
|
CACHED_POI_CATEGORIES +
|
||||||
|
" FROM " +
|
||||||
|
POI_TYPES_CACHE_NAME +
|
||||||
|
" WHERE " + MAP_FILE_NAME + " = ?", new String[]{fileName});
|
||||||
|
if (query != null && query.moveToFirst()) {
|
||||||
|
long lastModified = query.getLong(0);
|
||||||
|
Map<String, List<String>> categories = getCategories(query.getString(1));
|
||||||
|
cache = new Pair<>(lastModified, categories);
|
||||||
|
}
|
||||||
|
if (query != null) {
|
||||||
|
query.close();
|
||||||
|
}
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, List<String>> getCategories(String json) {
|
||||||
|
Map<String, List<String>> categories = new HashMap<>();
|
||||||
|
try {
|
||||||
|
JSONArray jsonArray = new JSONArray(json);
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
||||||
|
String category = jsonObject.optString(CATEGORY_KEY);
|
||||||
|
List<String> subCategories = getSubCategories(jsonObject.optString(SUB_CATEGORIES_KEY));
|
||||||
|
categories.put(category, subCategories);
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
LOG.error("Error parsing categories: " + e);
|
||||||
|
}
|
||||||
|
return categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateCacheForResource(SQLiteConnection db, String fileName, long lastModified, Map<String, List<String>> categories) {
|
||||||
|
try {
|
||||||
|
db.execSQL("UPDATE " + POI_TYPES_CACHE_NAME + " SET " +
|
||||||
|
MAP_FILE_DATE + " = ?, " +
|
||||||
|
CACHED_POI_CATEGORIES + " = ? " +
|
||||||
|
"WHERE " + MAP_FILE_NAME + " = ?",
|
||||||
|
new Object[]{lastModified, getCategoriesJson(categories), fileName});
|
||||||
|
} catch (JSONException e) {
|
||||||
|
LOG.error("Error converting category to json: " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void insertCacheForResource(SQLiteConnection db, String fileName, long lastModified, Map<String, List<String>> categories) {
|
||||||
|
try {
|
||||||
|
db.execSQL("INSERT INTO " + POI_TYPES_CACHE_NAME + " VALUES(?,?,?)",
|
||||||
|
new Object[]{fileName, lastModified, getCategoriesJson(categories)});
|
||||||
|
} catch (JSONException e) {
|
||||||
|
LOG.error("Error converting category to json: " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getCategoriesJson(Map<String, List<String>> categories) throws JSONException {
|
||||||
|
JSONArray json = new JSONArray();
|
||||||
|
for (Map.Entry<String, List<String>> entry : categories.entrySet()) {
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
JSONArray subCategories = new JSONArray();
|
||||||
|
for (String subCategory : entry.getValue()) {
|
||||||
|
subCategories.put(subCategory);
|
||||||
|
}
|
||||||
|
jsonObject.put(CATEGORY_KEY, entry.getKey());
|
||||||
|
jsonObject.put(SUB_CATEGORIES_KEY, subCategories);
|
||||||
|
json.put(jsonObject);
|
||||||
|
}
|
||||||
|
return json.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getSubCategories(@NonNull String json) throws JSONException {
|
||||||
|
List<String> subCategories = new ArrayList<>();
|
||||||
|
JSONArray jsonArray = new JSONArray(json);
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
subCategories.add(jsonArray.optString(i));
|
||||||
|
}
|
||||||
|
return subCategories;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package net.osmand.plus.resources;
|
package net.osmand.plus.resources;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.core.util.Pair;
|
||||||
|
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
import net.osmand.PlatformUtil;
|
import net.osmand.PlatformUtil;
|
||||||
|
@ -9,8 +10,12 @@ import net.osmand.binary.BinaryMapIndexReader;
|
||||||
import net.osmand.binary.BinaryMapIndexReader.MapIndex;
|
import net.osmand.binary.BinaryMapIndexReader.MapIndex;
|
||||||
import net.osmand.binary.BinaryMapIndexReader.SearchPoiTypeFilter;
|
import net.osmand.binary.BinaryMapIndexReader.SearchPoiTypeFilter;
|
||||||
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
import net.osmand.binary.BinaryMapIndexReader.SearchRequest;
|
||||||
|
import net.osmand.binary.BinaryMapPoiReaderAdapter;
|
||||||
import net.osmand.data.Amenity;
|
import net.osmand.data.Amenity;
|
||||||
|
import net.osmand.osm.MapPoiTypes;
|
||||||
import net.osmand.osm.PoiCategory;
|
import net.osmand.osm.PoiCategory;
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.poi.PoiFiltersHelper;
|
||||||
import net.osmand.plus.resources.ResourceManager.BinaryMapReaderResource;
|
import net.osmand.plus.resources.ResourceManager.BinaryMapReaderResource;
|
||||||
import net.osmand.plus.resources.ResourceManager.BinaryMapReaderResourceType;
|
import net.osmand.plus.resources.ResourceManager.BinaryMapReaderResourceType;
|
||||||
import net.osmand.util.MapUtils;
|
import net.osmand.util.MapUtils;
|
||||||
|
@ -18,6 +23,7 @@ import net.osmand.util.MapUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -27,9 +33,73 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
||||||
|
|
||||||
private final static Log log = PlatformUtil.getLog(AmenityIndexRepositoryBinary.class);
|
private final static Log log = PlatformUtil.getLog(AmenityIndexRepositoryBinary.class);
|
||||||
private BinaryMapReaderResource resource;
|
private BinaryMapReaderResource resource;
|
||||||
|
private MapPoiTypes poiTypes;
|
||||||
|
private Map<String, List<String>> deltaPoiCategories = new HashMap<>();
|
||||||
|
|
||||||
public AmenityIndexRepositoryBinary(BinaryMapReaderResource resource) {
|
public AmenityIndexRepositoryBinary(BinaryMapReaderResource resource, OsmandApplication app) {
|
||||||
this.resource = resource;
|
this.resource = resource;
|
||||||
|
poiTypes = app.getPoiTypes();
|
||||||
|
checkCachedCategories(app.getPoiFilters());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, List<String>> getDeltaPoiCategories() {
|
||||||
|
return deltaPoiCategories;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkCachedCategories(PoiFiltersHelper poiFiltersHelper) {
|
||||||
|
String fileName = resource.getFileName();
|
||||||
|
long lastModified = resource.getFileLastModified();
|
||||||
|
Pair<Long, Map<String, List<String>>> cache = poiFiltersHelper.getCacheByResourceName(fileName);
|
||||||
|
if (cache == null || cache.first != null && cache.first != lastModified) {
|
||||||
|
deltaPoiCategories = new HashMap<>();
|
||||||
|
try {
|
||||||
|
BinaryMapIndexReader reader = getOpenFile();
|
||||||
|
if (reader != null) {
|
||||||
|
reader.initCategories();
|
||||||
|
List<BinaryMapPoiReaderAdapter.PoiRegion> regions = reader.getPoiIndexes();
|
||||||
|
for (BinaryMapPoiReaderAdapter.PoiRegion region : regions) {
|
||||||
|
calculateDeltaSubcategories(region);
|
||||||
|
}
|
||||||
|
if (cache == null) {
|
||||||
|
poiFiltersHelper.insertCacheForResource(fileName, lastModified, deltaPoiCategories);
|
||||||
|
} else {
|
||||||
|
poiFiltersHelper.updateCacheForResource(fileName, lastModified, deltaPoiCategories);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error initializing categories ", e);
|
||||||
|
}
|
||||||
|
} else if (cache.second != null) {
|
||||||
|
deltaPoiCategories = cache.second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void calculateDeltaSubcategories(BinaryMapPoiReaderAdapter.PoiRegion region) {
|
||||||
|
List<String> categories = region.getCategories();
|
||||||
|
List<List<String>> subCategories = region.getSubcategories();
|
||||||
|
for (int i = 0; i < categories.size(); i++) {
|
||||||
|
String categoryName = categories.get(i);
|
||||||
|
|
||||||
|
PoiCategory poiCategory = poiTypes.getPoiCategoryByName(categoryName);
|
||||||
|
List<String> deltaSubCategories = null;
|
||||||
|
for (List<String> subList : subCategories) {
|
||||||
|
for (String subCategory : subList) {
|
||||||
|
if (poiCategory.getPoiTypeByKeyName(subCategory) != null) {
|
||||||
|
if (deltaSubCategories == null) {
|
||||||
|
deltaSubCategories = new ArrayList<>();
|
||||||
|
}
|
||||||
|
deltaSubCategories.add(subCategory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (deltaSubCategories != null) {
|
||||||
|
if(deltaPoiCategories.containsKey(categoryName)) {
|
||||||
|
deltaPoiCategories.get(categoryName).addAll(deltaSubCategories);
|
||||||
|
} else {
|
||||||
|
deltaPoiCategories.put(categoryName, deltaSubCategories);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@ -54,8 +124,8 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
||||||
BinaryMapIndexReader reader = getOpenFile();
|
BinaryMapIndexReader reader = getOpenFile();
|
||||||
return reader != null && reader.containsPoiData(left31, top31, right31, bottom31);
|
return reader != null && reader.containsPoiData(left31, top31, right31, bottom31);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public synchronized Map<PoiCategory, List<String>> searchAmenityCategoriesByName(String query, Map<PoiCategory, List<String>> map) {
|
public synchronized Map<PoiCategory, List<String>> searchAmenityCategoriesByName(String query, Map<PoiCategory, List<String>> map) {
|
||||||
try {
|
try {
|
||||||
BinaryMapIndexReader reader = getOpenFile();
|
BinaryMapIndexReader reader = getOpenFile();
|
||||||
|
@ -65,12 +135,12 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public synchronized List<Amenity> searchAmenitiesByName(int x, int y, int l, int t, int r, int b, String query, ResultMatcher<Amenity> resulMatcher) {
|
public synchronized List<Amenity> searchAmenitiesByName(int x, int y, int l, int t, int r, int b, String query, ResultMatcher<Amenity> resulMatcher) {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
List<Amenity> amenities = Collections.emptyList();
|
List<Amenity> amenities = Collections.emptyList();
|
||||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(x, y, query, l, r, t, b,resulMatcher);
|
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(x, y, query, l, r, t, b, resulMatcher);
|
||||||
try {
|
try {
|
||||||
BinaryMapIndexReader index = getOpenFile();
|
BinaryMapIndexReader index = getOpenFile();
|
||||||
if (index != null) {
|
if (index != null) {
|
||||||
|
@ -90,10 +160,10 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
||||||
}
|
}
|
||||||
return amenities;
|
return amenities;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized List<Amenity> searchAmenities(int stop, int sleft, int sbottom, int sright, int zoom,
|
public synchronized List<Amenity> searchAmenities(int stop, int sleft, int sbottom, int sright, int zoom,
|
||||||
final SearchPoiTypeFilter filter, ResultMatcher<Amenity> matcher) {
|
final SearchPoiTypeFilter filter, ResultMatcher<Amenity> matcher) {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(sleft, sright, stop, sbottom, zoom,
|
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(sleft, sright, stop, sbottom, zoom,
|
||||||
filter, matcher);
|
filter, matcher);
|
||||||
|
@ -118,7 +188,7 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
List<Amenity> result = null;
|
List<Amenity> result = null;
|
||||||
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(locations, radius,
|
SearchRequest<Amenity> req = BinaryMapIndexReader.buildSearchPoiRequest(locations, radius,
|
||||||
filter, matcher );
|
filter, matcher);
|
||||||
try {
|
try {
|
||||||
BinaryMapIndexReader reader = getOpenFile();
|
BinaryMapIndexReader reader = getOpenFile();
|
||||||
if (reader != null) {
|
if (reader != null) {
|
||||||
|
@ -129,10 +199,10 @@ public class AmenityIndexRepositoryBinary implements AmenityIndexRepository {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
if (log.isDebugEnabled() && result != null) {
|
if (log.isDebugEnabled() && result != null) {
|
||||||
log.debug(String.format("Search done in %s ms found %s.", (System.currentTimeMillis() - now), result.size())); //$NON-NLS-1$
|
log.debug(String.format("Search done in %s ms found %s.", (System.currentTimeMillis() - now), result.size())); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ import net.osmand.map.MapTileDownloader.DownloadRequest;
|
||||||
import net.osmand.map.OsmandRegions;
|
import net.osmand.map.OsmandRegions;
|
||||||
import net.osmand.osm.MapPoiTypes;
|
import net.osmand.osm.MapPoiTypes;
|
||||||
import net.osmand.osm.PoiCategory;
|
import net.osmand.osm.PoiCategory;
|
||||||
|
import net.osmand.osm.PoiType;
|
||||||
import net.osmand.plus.AppInitializer;
|
import net.osmand.plus.AppInitializer;
|
||||||
import net.osmand.plus.AppInitializer.InitEvents;
|
import net.osmand.plus.AppInitializer.InitEvents;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
@ -152,6 +153,10 @@ public class ResourceManager {
|
||||||
return filename.getName();
|
return filename.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getFileLastModified() {
|
||||||
|
return filename.lastModified();
|
||||||
|
}
|
||||||
|
|
||||||
// should not use methods to read from file!
|
// should not use methods to read from file!
|
||||||
@Nullable
|
@Nullable
|
||||||
public BinaryMapIndexReader getShallowReader() {
|
public BinaryMapIndexReader getShallowReader() {
|
||||||
|
@ -735,7 +740,7 @@ public class ResourceManager {
|
||||||
resource.setUseForPublicTransport(true);
|
resource.setUseForPublicTransport(true);
|
||||||
}
|
}
|
||||||
if (mapReader.containsPoiData()) {
|
if (mapReader.containsPoiData()) {
|
||||||
amenityRepositories.put(f.getName(), new AmenityIndexRepositoryBinary(resource));
|
amenityRepositories.put(f.getName(), new AmenityIndexRepositoryBinary(resource, context));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (SQLiteException e) {
|
} catch (SQLiteException e) {
|
||||||
|
@ -746,6 +751,17 @@ public class ResourceManager {
|
||||||
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_big_for_memory), f.getName()));
|
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_big_for_memory), f.getName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (AmenityIndexRepository repo : amenityRepositories.values()) {
|
||||||
|
Map<String, List<String>> categories = ((AmenityIndexRepositoryBinary) repo).getDeltaPoiCategories();
|
||||||
|
if (!categories.isEmpty()) {
|
||||||
|
for (Map.Entry<String, List<String>> entry : categories.entrySet()) {
|
||||||
|
PoiCategory poiCategory = context.getPoiTypes().getPoiCategoryByName(entry.getKey(), true);
|
||||||
|
for (String s : entry.getValue()) {
|
||||||
|
poiCategory.addPoiType(new PoiType(MapPoiTypes.getDefault(), poiCategory, null, s));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
log.debug("All map files initialized " + (System.currentTimeMillis() - val) + " ms");
|
log.debug("All map files initialized " + (System.currentTimeMillis() - val) + " ms");
|
||||||
if (files.size() > 0 && (!indCache.exists() || indCache.canWrite())) {
|
if (files.size() > 0 && (!indCache.exists() || indCache.canWrite())) {
|
||||||
try {
|
try {
|
||||||
|
@ -1122,21 +1138,6 @@ public class ResourceManager {
|
||||||
return readers.toArray(new BinaryMapIndexReader[readers.size()]);
|
return readers.toArray(new BinaryMapIndexReader[readers.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BinaryMapIndexReader[] getPoiSearchFiles() {
|
|
||||||
Collection<BinaryMapReaderResource> fileReaders = getFileReaders();
|
|
||||||
List<BinaryMapIndexReader> readers = new ArrayList<>(fileReaders.size());
|
|
||||||
for (BinaryMapReaderResource r : fileReaders) {
|
|
||||||
BinaryMapIndexReader shallowReader = r.getShallowReader();
|
|
||||||
if (shallowReader != null && shallowReader.containsPoiData()) {
|
|
||||||
BinaryMapIndexReader reader = r.getReader(BinaryMapReaderResourceType.POI);
|
|
||||||
if (reader != null) {
|
|
||||||
readers.add(reader);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return readers.toArray(new BinaryMapIndexReader[readers.size()]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getIndexFileNames() {
|
public Map<String, String> getIndexFileNames() {
|
||||||
return new LinkedHashMap<String, String>(indexFileNames);
|
return new LinkedHashMap<String, String>(indexFileNames);
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,8 @@ import net.osmand.plus.render.RenderingIcons;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -90,6 +92,12 @@ public class QuickSearchCustomPoiFragment extends DialogFragment {
|
||||||
this.nightMode = app.getSettings().OSMAND_THEME.get() == OsmandSettings.OSMAND_DARK_THEME;
|
this.nightMode = app.getSettings().OSMAND_THEME.get() == OsmandSettings.OSMAND_DARK_THEME;
|
||||||
setStyle(STYLE_NO_FRAME, nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme);
|
setStyle(STYLE_NO_FRAME, nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme);
|
||||||
poiCategoryList = app.getPoiTypes().getCategories(false);
|
poiCategoryList = app.getPoiTypes().getCategories(false);
|
||||||
|
Collections.sort(poiCategoryList, new Comparator<PoiCategory>() {
|
||||||
|
@Override
|
||||||
|
public int compare(PoiCategory poiCategory, PoiCategory t1) {
|
||||||
|
return poiCategory.getTranslation().compareTo(t1.getTranslation());
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue