Merge pull request #10369 from osmandapp/issue_336_wikiwoyage_bigfix

travel obf resource manager reader added
This commit is contained in:
alex-osm 2020-12-15 18:26:16 +03:00 committed by GitHub
commit 7538d5bea1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 198 additions and 7 deletions

View file

@ -67,6 +67,7 @@ import net.osmand.plus.voice.MediaCommandPlayerImpl;
import net.osmand.plus.voice.TTSCommandPlayerImpl;
import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.plus.wikivoyage.data.TravelHelper;
import net.osmand.plus.wikivoyage.data.TravelObfHelper;
import net.osmand.render.RenderingRulesStorage;
import net.osmand.router.RoutingConfiguration;
import net.osmand.util.Algorithms;
@ -459,7 +460,7 @@ public class AppInitializer implements IProgress {
app.mapViewTrackingUtilities = startupInit(new MapViewTrackingUtilities(app), MapViewTrackingUtilities.class);
// TODOTRAVEL_OBF_HELPER check ResourceManager and use TravelObfHelper
app.travelHelper = new TravelDbHelper(app);
app.travelHelper = !TravelDbHelper.checkIfDbFileExists(app) ? new TravelObfHelper(app) : new TravelDbHelper(app);
app.travelHelper.initializeDataOnAppStartup();
app.travelHelper = startupInit(app.travelHelper, TravelHelper.class);

View file

@ -75,7 +75,6 @@ import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import static net.osmand.IndexConstants.VOICE_INDEX_DIR;
/**
@ -210,7 +209,7 @@ public class ResourceManager {
protected final Map<String, AmenityIndexRepository> amenityRepositories = new ConcurrentHashMap<String, AmenityIndexRepository>();
// protected final Map<String, BinaryMapIndexReader> routingMapFiles = new ConcurrentHashMap<String, BinaryMapIndexReader>();
protected final Map<String, BinaryMapReaderResource> transportRepositories = new ConcurrentHashMap<String, BinaryMapReaderResource>();
protected final Map<String, BinaryMapReaderResource> travelRepositories = new ConcurrentHashMap<String, BinaryMapReaderResource>();
protected final Map<String, String> indexFileNames = new ConcurrentHashMap<String, String>();
protected final Map<String, String> basemapFileNames = new ConcurrentHashMap<String, String>();
@ -634,6 +633,7 @@ public class ResourceManager {
collectFiles(roadsPath, IndexConstants.BINARY_MAP_INDEX_EXT, files);
if (Version.isPaidVersion(context)) {
collectFiles(context.getAppPath(IndexConstants.WIKI_INDEX_DIR), IndexConstants.BINARY_MAP_INDEX_EXT, files);
collectFiles(context.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR), IndexConstants.BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT, files);
}
if (OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) != null || InAppPurchaseHelper.isSubscribedToLiveUpdates(context)) {
collectFiles(context.getAppPath(IndexConstants.SRTM_INDEX_DIR), IndexConstants.BINARY_MAP_INDEX_EXT, files);
@ -726,7 +726,10 @@ public class ResourceManager {
}
renderer.initializeNewResource(progress, f, mapReader);
BinaryMapReaderResource resource = new BinaryMapReaderResource(f, mapReader);
if (collectTravelFiles(resource)){
//travel files are indexed
continue;
}
fileReaders.put(f.getName(), resource);
if (!mapReader.getRegionNames().isEmpty()) {
RegionAddressRepositoryBinary rarb = new RegionAddressRepositoryBinary(this, resource);
@ -798,7 +801,43 @@ public class ResourceManager {
return warnings;
}
private List<BinaryMapIndexReader> getTravelRepositories() {
List<String> fileNames = new ArrayList<>(travelRepositories.keySet());
Collections.sort(fileNames, Algorithms.getStringVersionComparator());
List<BinaryMapIndexReader> res = new ArrayList<>();
for (String fileName : fileNames) {
BinaryMapReaderResource r = travelRepositories.get(fileName);
if (r != null) {
res.add(r.getReader(BinaryMapReaderResourceType.POI));
}
}
return res;
}
private List<BinaryMapIndexReader> getTravelRepositories(double topLat, double leftLon, double bottomLat, double rightLon) {
List<String> fileNames = new ArrayList<>(travelRepositories.keySet());
Collections.sort(fileNames, Algorithms.getStringVersionComparator());
int leftX31 = MapUtils.get31TileNumberX(leftLon);
int topX31 = MapUtils.get31TileNumberY(topLat);
int rightX31 = MapUtils.get31TileNumberX(rightLon);
int bottomX31 = MapUtils.get31TileNumberY(bottomLat);
List<BinaryMapIndexReader> res = new ArrayList<>();
for (String fileName : fileNames) {
BinaryMapReaderResource r = travelRepositories.get(fileName);
if (r != null && r.getShallowReader().containsPoiData(leftX31, topX31, rightX31, bottomX31)) {
res.add(r.getReader(BinaryMapReaderResourceType.POI));
}
}
return res;
}
private boolean collectTravelFiles(BinaryMapReaderResource resource) {
if (resource.getFileName().contains(IndexConstants.BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT)){
travelRepositories.put(resource.getFileName(), resource);
return true;
}
return false;
}
public void initMapBoundariesCacheNative() {
File indCache = context.getAppPath(INDEXES_CACHE);
@ -1065,6 +1104,7 @@ public class ResourceManager {
addressMap.remove(fileName);
transportRepositories.remove(fileName);
indexFileNames.remove(fileName);
travelRepositories.remove(fileName);
renderer.closeConnection(fileName);
BinaryMapReaderResource resource = fileReaders.remove(fileName);
if(resource != null) {
@ -1080,6 +1120,7 @@ public class ResourceManager {
basemapFileNames.clear();
renderer.clearAllResources();
transportRepositories.clear();
travelRepositories.clear();
addressMap.clear();
amenityRepositories.clear();
for(BinaryMapReaderResource res : fileReaders.values()) {
@ -1087,8 +1128,7 @@ public class ResourceManager {
}
fileReaders.clear();
}
public BinaryMapIndexReader[] getRoutingMapFiles() {
Collection<BinaryMapReaderResource> fileReaders = getFileReaders();
List<BinaryMapIndexReader> readers = new ArrayList<>(fileReaders.size());

View file

@ -114,6 +114,18 @@ public class TravelDbHelper implements TravelHelper {
localDataHelper = new TravelLocalDataHelper(application);
}
public static boolean checkIfDbFileExists(OsmandApplication app) {
File[] files = app.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR).listFiles();
if (files != null) {
for (File file : files) {
if (file.getName().endsWith(IndexConstants.BINARY_WIKIVOYAGE_MAP_INDEX_EXT)) {
return true;
}
}
}
return false;
}
public TravelLocalDataHelper getBookmarksHelper() {
return localDataHelper;
}

View file

@ -0,0 +1,138 @@
package net.osmand.plus.wikivoyage.data;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.CollatorStringMatcher;
import net.osmand.GPXUtilities;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.ResultMatcher;
import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.data.Amenity;
import net.osmand.data.MapObject;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.api.SQLiteAPI;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class TravelObfHelper implements TravelHelper {
private static final Log LOG = PlatformUtil.getLog(TravelObfHelper.class);
private final OsmandApplication application;
private TravelLocalDataHelper localDataHelper;
private List<TravelArticle> popularArticles = new ArrayList<TravelArticle>();
public TravelObfHelper(OsmandApplication application) {
this.application = application;
localDataHelper = new TravelLocalDataHelper(application);
}
public TravelLocalDataHelper getBookmarksHelper() {
return localDataHelper;
}
@Override
public void initializeDataOnAppStartup() {
}
@Override
public boolean isAnyTravelBookPresent() {
return checkIfObfFileExists(application);
}
public void initializeDataToDisplay() {
localDataHelper.refreshCachedData();
loadPopularArticles();
}
@NonNull
public List<WikivoyageSearchResult> search(final String searchQuery) {
List<WikivoyageSearchResult> res = new ArrayList<>();
return res;
}
@NonNull
public List<TravelArticle> getPopularArticles() {
return popularArticles;
}
@Override
public Map<WikivoyageSearchResult, List<WikivoyageSearchResult>> getNavigationMap(TravelArticle article) {
return null;
}
@Override
public TravelArticle getArticleById(String routeId, String lang) {
return null;
}
@Override
public TravelArticle getArticleByTitle(String title, String lang) {
return null;
}
@Override
public String getArticleId(String title, String lang) {
return null;
}
@Override
public ArrayList<String> getArticleLangs(String articleId) {
return null;
}
@NonNull
public List<TravelArticle> loadPopularArticles() {
popularArticles = new ArrayList<>();
return popularArticles;
}
public String getGPXName(TravelArticle article) {
return article.getTitle().replace('/', '_').replace('\'', '_')
.replace('\"', '_') + IndexConstants.GPX_FILE_EXT;
}
public File createGpxFile(TravelArticle article) {
final GPXUtilities.GPXFile gpx = article.getGpxFile();
File file = application.getAppPath(IndexConstants.GPX_TRAVEL_DIR + getGPXName(article));
if (!file.exists()) {
GPXUtilities.writeGpxFile(file, gpx);
}
return file;
}
@Override
public String getSelectedTravelBookName() {
return null;
}
public static boolean checkIfObfFileExists(OsmandApplication app) {
File[] files = app.getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR).listFiles();
if (files != null) {
for (File f : files) {
if (f.getName().contains(IndexConstants.BINARY_TRAVEL_GUIDE_MAP_INDEX_EXT)) {
return true;
}
}
}
return false;
}
}