package net.osmand.plus.activities.search;
import java.util.Comparator;
import java.util.List;
import android.widget.AdapterView;
import net.osmand.ResultMatcher;
import net.osmand.data.Building;
import net.osmand.data.City;
import net.osmand.data.LatLon;
import net.osmand.data.Street;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.search.SearchAddressFragment.AddressInformation;
import net.osmand.plus.resources.RegionAddressRepository;
import net.osmand.util.Algorithms;
import android.os.AsyncTask;
import android.view.View;
import android.widget.Toast;
public class SearchBuildingByNameActivity extends SearchByNameAbstractActivity<Building> {
private RegionAddressRepository region;
private City city;
private Street street;
@Override
protected Comparator<? super Building> createComparator() {
return new Comparator<Building>() {
@Override
public int compare(Building o1, Building o2) {
int i1 = Algorithms.extractFirstIntegerNumber(o1.getName());
int i2 = Algorithms.extractFirstIntegerNumber(o2.getName());
return i1 - i2;
}
};
}
@Override
protected void reset() {
//This is really only a "clear input text field", hence do not reset settings here
//osmandSettings.setLastSearchedBuilding("", null);
super.reset();
}
@Override
public AsyncTask<Object, ?, ?> getInitializeTask() {
return new AsyncTask<Object, Void, List<Building>>(){
@Override
protected void onPostExecute(List<Building> result) {
setLabelText(R.string.incremental_search_building);
progress.setVisibility(View.INVISIBLE);
finishInitializing(result);
if (result == null || result.isEmpty()) {
Toast.makeText(SearchBuildingByNameActivity.this,
R.string.no_buildings_found, Toast.LENGTH_LONG).show();
quitActivity(SearchStreet2ByNameActivity.class);
}
}
@Override
protected void onPreExecute() {
setLabelText(R.string.loading_streets_buildings);
progress.setVisibility(View.VISIBLE);
}
@Override
protected List<Building> doInBackground(Object... params) {
region = ((OsmandApplication)getApplication()).getResourceManager().getRegionRepository(settings.getLastSearchedRegion());
if(region != null){
city = region.getCityById(settings.getLastSearchedCity(), settings.getLastSearchedCityName());
street = region.getStreetByName(city, settings.getLastSearchedStreet());
}
if(street != null){
// preload here to avoid concurrent modification
region.preloadBuildings(street, new ResultMatcher<Building>() {
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean publish(Building object) {
addObjectToInitialList(object);
return true;
}
});
return street.getBuildings();
}
return null;
}
};
}
@Override
public String getText(Building obj) {
if(obj.getInterpolationInterval() > 0 || obj.getInterpolationType() != null){
String hno = getCurrentFilter();
if(hno.length() > 0 && obj.belongsToInterpolation(hno)) {
return hno + " [" + obj.getName(region.getLang(), region.isTransliterateNames())+"]";
}
}
return obj.getName(region.getLang(), region.isTransliterateNames());
}
@Override
public String getShortText(Building obj) {
if(obj.getInterpolationInterval() > 0 || obj.getInterpolationType() != null){
return "";
}
return super.getShortText(obj);
}
@Override
public void itemSelected(Building obj) {
String text = getText(obj);
String hno = getCurrentFilter();
LatLon loc = obj.getLocation();
float interpolation = obj.interpolation(hno);
if(interpolation >= 0) {
loc = obj.getLocation(interpolation);
text = hno;
}
settings.setLastSearchedBuilding(text, loc);
if(isSelectAddres()) {
finish();
} else {
showOnMap(loc, AddressInformation.buildBuilding(this, settings));
}
}
@Override
protected AddressInformation getAddressInformation() {
return AddressInformation.buildStreet(this, settings);
}
@Override
public boolean filterObject(Building obj, String filter){
if(super.filterObject(obj, filter)){
return true;
}
if(obj.belongsToInterpolation(filter)){
return true;
}
return false;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
}