package net.osmand.plus.activities.search;
import java.text.MessageFormat;
import net.osmand.data.Building;
import net.osmand.data.City;
import net.osmand.data.MapObject;
import net.osmand.data.PostCode;
import net.osmand.data.Street;
import net.osmand.osm.LatLon;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.RegionAddressRepository;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.OsmandApplication;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
public class SearchAddressActivity extends Activity {
private Button showOnMap;
private Button streetButton;
private Button cityButton;
private Button countryButton;
private Button buildingButton;
private Button navigateTo;
private RegionAddressRepository region = null;
private City city = null;
private PostCode postcode = null;
private Street street = null;
private Building building = null;
private Street street2 = null;
private boolean radioBuilding = true;
private Button searchOnline;
private ProgressDialog progressDlg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.search_address);
showOnMap = (Button) findViewById(R.id.ShowOnMap);
navigateTo = (Button) findViewById(R.id.NavigateTo);
streetButton = (Button) findViewById(R.id.StreetButton);
cityButton = (Button) findViewById(R.id.CityButton);
countryButton = (Button) findViewById(R.id.CountryButton);
buildingButton = (Button) findViewById(R.id.BuildingButton);
searchOnline = (Button) findViewById(R.id.SearchOnline);
attachListeners();
}
private void attachListeners() {
if (getParent() instanceof SearchActivity) {
searchOnline.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((SearchActivity) getParent()).startSearchAddressOnline();
}
});
} else {
searchOnline.setVisibility(View.INVISIBLE);
}
countryButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
startActivity(new Intent(SearchAddressActivity.this, SearchRegionByNameActivity.class));
}
});
cityButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
startActivity(new Intent(SearchAddressActivity.this, SearchCityByNameActivity.class));
}
});
streetButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
startActivity(new Intent(SearchAddressActivity.this, SearchStreetByNameActivity.class));
}
});
buildingButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(radioBuilding){
OsmandSettings.removeLastSearchedIntersectedStreet(SearchAddressActivity.this);
startActivity(new Intent(SearchAddressActivity.this, SearchBuildingByNameActivity.class));
} else {
OsmandSettings.setLastSearchedIntersectedStreet(SearchAddressActivity.this, ""); //$NON-NLS-1$
startActivity(new Intent(SearchAddressActivity.this, SearchStreet2ByNameActivity.class));
}
}
});
navigateTo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showOnMap(true);
}
});
showOnMap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showOnMap(false);
}
});
findViewById(R.id.ResetBuilding).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
building = null;
updateUI();
}
});
findViewById(R.id.ResetStreet).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
street = null;
building = null;
street2 = null;
updateUI();
}
});
findViewById(R.id.ResetCity).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
postcode = null;
city = null;
street = null;
street2 = null;
building = null;
updateUI();
}
});
findViewById(R.id.ResetCountry).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
region = null;
postcode = null;
city = null;
street = null;
street2 = null;
building = null;
updateUI();
}
});
((RadioGroup)findViewById(R.id.RadioGroup)).setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
SearchAddressActivity.this.radioBuilding = checkedId == R.id.RadioBuilding;
if(radioBuilding){
SearchAddressActivity.this.street2 = null;
} else {
SearchAddressActivity.this.building = null;
}
updateBuildingSection();
}
});
}
public void showOnMap(boolean navigateTo){
LatLon l = null;
String historyName = null;
int zoom = 12;
boolean en = OsmandSettings.usingEnglishNames(OsmandSettings.getPrefs(this));
if (street2 != null && street != null) {
l = region.findStreetIntersection(street, street2);
if(l != null) {
String cityName = postcode != null? postcode.getName() : city.getName(en);
historyName = MessageFormat.format(getString(R.string.search_history_int_streets),
street.getName(en), street2.getName(en), cityName);
zoom = 16;
}
} else if (building != null) {
l = building.getLocation();
String cityName = postcode != null? postcode.getName() : city.getName(en);
historyName = MessageFormat.format(getString(R.string.search_history_building), building.getName(en), street.getName(en), cityName);
zoom = 16;
} else if (street != null) {
l = street.getLocation();
String cityName = postcode != null? postcode.getName() : city.getName(en);
historyName = MessageFormat.format(getString(R.string.search_history_street), street.getName(en), cityName);
zoom = 14;
} else if (city != null) {
l = city.getLocation();
historyName = MessageFormat.format(getString(R.string.search_history_city), city.getName(en));
zoom = 12;
}
if (l != null) {
if(navigateTo){
OsmandSettings.setPointToNavigate(SearchAddressActivity.this, l.getLatitude(), l.getLongitude());
} else {
OsmandSettings.setMapLocationToShow(SearchAddressActivity.this, l.getLatitude(), l.getLongitude(), zoom, historyName);
}
startActivity(new Intent(SearchAddressActivity.this, MapActivity.class));
}
}
@Override
protected void onStop() {
if(progressDlg != null){
progressDlg.dismiss();
progressDlg = null;
}
super.onStop();
}
protected void updateBuildingSection(){
if(radioBuilding){
((TextView)findViewById(R.id.BuildingText)).setText(R.string.search_address_building);
if(building == null){
((TextView)findViewById(R.id.BuildingButton)).setText(R.string.choose_building);
} else {
((TextView)findViewById(R.id.BuildingButton)).setText(building.getName(region.useEnglishNames()));
}
} else {
((TextView)findViewById(R.id.BuildingText)).setText(R.string.search_address_street);
if(street2 == null){
((TextView)findViewById(R.id.BuildingButton)).setText(R.string.choose_intersected_street);
} else {
((TextView)findViewById(R.id.BuildingButton)).setText(street2.getName(region.useEnglishNames()));
}
}
findViewById(R.id.ResetBuilding).setEnabled(building != null || street2 != null);
}
protected void updateUI(){
findViewById(R.id.ResetCountry).setEnabled(region != null);
if(region == null){
countryButton.setText(R.string.ChooseCountry);
} else {
countryButton.setText(region.getName());
}
findViewById(R.id.ResetCity).setEnabled(postcode != null || city != null);
if(city == null && postcode == null){
cityButton.setText(R.string.choose_city);
} else {
if(postcode != null){
cityButton.setText(postcode.getName());
} else {
cityButton.setText(city.getName(region.useEnglishNames()));
}
}
cityButton.setEnabled(region != null);
findViewById(R.id.ResetStreet).setEnabled(street != null);
if(street == null){
streetButton.setText(R.string.choose_street);
} else {
streetButton.setText(street.getName(region.useEnglishNames()));
}
streetButton.setEnabled(city != null || postcode != null);
buildingButton.setEnabled(street != null);
((RadioGroup)findViewById(R.id.RadioGroup)).setVisibility(street == null ? View.GONE : View.VISIBLE);
if(radioBuilding){
((RadioButton)findViewById(R.id.RadioBuilding)).setChecked(true);
} else {
((RadioButton)findViewById(R.id.RadioIntersStreet)).setChecked(true);
}
updateBuildingSection();
showOnMap.setEnabled(city != null || street != null);
navigateTo.setEnabled(city != null || street != null);
}
public void loadData(){
SharedPreferences prefs = OsmandSettings.getPrefs(this);
if (region != null) {
if(region.useEnglishNames() != OsmandSettings.usingEnglishNames(prefs)){
region.setUseEnglishNames(OsmandSettings.usingEnglishNames(prefs));
}
String postcodeStr = OsmandSettings.getLastSearchedPostcode(prefs);
if(postcodeStr != null){
postcode = region.getPostcode(postcodeStr);
} else {
city = region.getCityById(OsmandSettings.getLastSearchedCity(prefs));
}
if (postcode != null || city != null) {
MapObject o = postcode == null ? city : postcode;
street = region.getStreetByName(o, OsmandSettings.getLastSearchedStreet(prefs));
if (street != null) {
String str = OsmandSettings.getLastSearchedIntersectedStreet(prefs);
radioBuilding = str == null;
if(str != null){
street2 = region.getStreetByName(o, str);
} else {
building = region.getBuildingByName(street, OsmandSettings.getLastSearchedBuilding(prefs));
}
}
}
}
}
protected void startLoadDataInThread(String progressMsg){
progressDlg = ProgressDialog.show(this, getString(R.string.loading), progressMsg, true);
new Thread("Loader search data") { //$NON-NLS-1$
@Override
public void run() {
try {
loadData();
} finally {
if (progressDlg != null) {
progressDlg.dismiss();
progressDlg = null;
runOnUiThread(new Runnable() {
@Override
public void run() {
updateUI();
}
});
}
}
}
}.start();
}
@Override
protected void onResume() {
super.onResume();
SharedPreferences prefs = OsmandSettings.getPrefs(this);
region = null;
String lastSearchedRegion = OsmandSettings.getLastSearchedRegion(prefs);
region = ((OsmandApplication)getApplication()).getResourceManager().getRegionRepository(lastSearchedRegion);
String progressMsg = null;
// try to determine whether progress dialog & new thread needed
if (region != null) {
Long cityId = OsmandSettings.getLastSearchedCity(prefs);
String postcode = OsmandSettings.getLastSearchedPostcode(prefs);
if (!region.areCitiesPreloaded()) {
progressMsg = getString(R.string.loading_cities);
} else if (postcode != null && !region.arePostcodesPreloaded()) {
progressMsg = getString(R.string.loading_postcodes);
} else if (cityId != -1 && region.getCityById(cityId) != null && region.getCityById(cityId).isEmptyWithStreets()) {
progressMsg = getString(R.string.loading_streets_buildings);
} else if (postcode != null && region.getPostcode(postcode) != null && region.getPostcode(postcode).isEmptyWithStreets()) {
progressMsg = getString(R.string.loading_streets_buildings);
} else if (OsmandSettings.usingEnglishNames(prefs) != region.useEnglishNames()) {
progressMsg = getString(R.string.converting_names);
}
}
postcode = null;
city = null;
street = null;
building = null;
if (progressMsg != null) {
startLoadDataInThread(progressMsg);
} else {
loadData();
updateUI();
}
}
}