package net.osmand.plus.resources;
import java.text.Collator;
import java.util.Comparator;
import java.util.List;
import net.osmand.ResultMatcher;
import net.osmand.data.Building;
import net.osmand.data.City;
import net.osmand.data.LatLon;
import net.osmand.data.MapObject;
import net.osmand.data.Street;
import net.osmand.util.MapUtils;
public interface RegionAddressRepository {
public String getName();
public String getCountryName();
public String getFileName() ;
public String getLang();
public boolean isTransliterateNames();
public LatLon getEstimatedRegionCenter();
// is called on low memory
public void clearCache();
// called to close resources
public void close();
public void preloadCities(ResultMatcher<City> resultMatcher);
public void preloadBuildings(Street street, ResultMatcher<Building> resultMatcher);
public void preloadStreets(City o, ResultMatcher<Street> resultMatcher);
public List<City> getLoadedCities();
// Returns city or postcode (if id < 0)
public City getCityById(long id, String name);
public Street getStreetByName(City cityOrPostcode, String name);
public Building getBuildingByName(Street street, String name);
public List<Street> getStreetsIntersectStreets(Street st);
void addCityToPreloadedList(City city);
public List<City> fillWithSuggestedCities(String name, ResultMatcher<City> resultMatcher, boolean searchVillagesMode, LatLon currentLocation);
public List<MapObject> searchMapObjectsByName(String name, ResultMatcher<MapObject> resultMatcher);
public static class MapObjectNameDistanceComparator implements Comparator<MapObject> {
private Collator collator = Collator.getInstance();
private final LatLon location;
private final String lang;
public MapObjectNameDistanceComparator(String lang, LatLon location){
this.lang = lang;
this.location = location;
}
@Override
public int compare(MapObject object1, MapObject object2) {
if(object1 == null || object2 == null){
return object2 == object1 ? 0 : (object1 == null ? -1 : 1);
} else {
int c = collator.compare(object1.getName(lang), object2.getName(lang));
if(c == 0 && location != null){
LatLon l1 = object1.getLocation();
LatLon l2 = object2.getLocation();
if(l1 == null || l2 == null){
return l2 == l1 ? 0 : (l1 == null ? -1 : 1);
}
return Double.compare(MapUtils.getDistance(location, l1), MapUtils.getDistance(location, l2));
}
return c;
}
}
}
}