package net.osmand.plus.activities.search; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.MenuItemCompat; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.plus.resources.RegionAddressRepository; import net.osmand.util.Algorithms; public class SearchAddressFragment extends Fragment { public static final String SELECT_ADDRESS_POINT_INTENT_KEY = "SELECT_ADDRESS_POINT_INTENT_KEY"; public static final int SELECT_ADDRESS_POINT_RESULT_OK = 1; private static final boolean ENABLE_ONLINE_ADDRESS = false; // disabled moved to poi search public static final String SELECT_ADDRESS_POINT_LAT = "SELECT_ADDRESS_POINT_LAT"; public static final String SELECT_ADDRESS_POINT_LON = "SELECT_ADDRESS_POINT_LON"; private static final int SHOW_ON_MAP = 2; private static final int ONLINE_SEARCH = 3; private static final int SELECT_POINT = 4; private Button streetButton; private Button cityButton; private Button countryButton; private Button buildingButton; private String region = null; private String city = null; private String postcode = null; private String street = null; private String building = null; private String street2 = null; private boolean radioBuilding = true; private OsmandSettings osmandSettings; private LatLon searchPoint = null; private View view; public View onCreateView(android.view.LayoutInflater inflater, android.view.ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.search_address, container, false); streetButton = (Button) findViewById(R.id.StreetButton); cityButton = (Button) findViewById(R.id.CityButton); countryButton = (Button) findViewById(R.id.CountryButton); buildingButton = (Button) findViewById(R.id.BuildingButton); osmandSettings = getApplication().getSettings(); attachListeners(); setHasOptionsMenu(true); return view; } @Override public void onCreateOptionsMenu(Menu onCreate, MenuInflater inflater) { Menu menu = onCreate; if(getActivity() instanceof SearchActivity) { ((SearchActivity) getActivity()).getClearToolbar(false); } if(getActivity() instanceof SearchAddressActivity) { MenuItem menuItem = menu.add(0, SELECT_POINT, 0, ""); MenuItemCompat.setShowAsAction(menuItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS); if (getApplication().accessibilityEnabled()) menuItem.setTitle(R.string.shared_string_ok); menuItem = menuItem.setIcon(R.drawable.ic_action_done); menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { select(SELECT_POINT); return true; } }); } else { MenuItem menuItem = menu.add(0, SHOW_ON_MAP, 0, R.string.shared_string_show_on_map); MenuItemCompat.setShowAsAction(menuItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS); menuItem = menuItem.setIcon(R.drawable.ic_action_marker_dark); menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { select(SHOW_ON_MAP); return true; } }); if (ENABLE_ONLINE_ADDRESS) { menuItem = menu.add(0, ONLINE_SEARCH, 0, R.string.search_online_address); MenuItemCompat.setShowAsAction(menuItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS); menuItem = menuItem.setIcon(R.drawable.ic_world_globe_dark); menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { ((SearchActivity) getActivity()).startSearchAddressOnline(); return true; } }); } } } private OsmandApplication getApplication() { return (OsmandApplication) getActivity().getApplication(); } private Intent createIntent(Class<?> cl){ LatLon location = null; Intent intent = getActivity().getIntent(); if(intent != null){ double lat = intent.getDoubleExtra(SearchActivity.SEARCH_LAT, 0); double lon = intent.getDoubleExtra(SearchActivity.SEARCH_LON, 0); if(lat != 0 || lon != 0){ location = new LatLon(lat, lon); } } if (location == null && getActivity() instanceof SearchActivity) { location = ((SearchActivity) getActivity()).getSearchPoint(); } Intent newIntent = new Intent(getActivity(), cl); if (location != null) { newIntent.putExtra(SearchActivity.SEARCH_LAT, location.getLatitude()); newIntent.putExtra(SearchActivity.SEARCH_LON, location.getLongitude()); } if(intent != null && getActivity() instanceof SearchAddressActivity) { newIntent.putExtra(SearchByNameAbstractActivity.SELECT_ADDRESS, true); } return newIntent; } private void attachListeners() { countryButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { startActivity(createIntent(SearchRegionByNameActivity.class)); } }); cityButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { startActivity(createIntent(SearchCityByNameActivity.class)); } }); streetButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { startActivity(createIntent(SearchStreetByNameActivity.class)); } }); buildingButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { if(radioBuilding){ startActivity(createIntent(SearchBuildingByNameActivity.class)); } else { startActivity(createIntent(SearchStreet2ByNameActivity.class)); } } }); OsmandApplication app = getApplication(); Drawable icon = getApplication().getIconsCache().getThemedIcon(R.drawable.ic_action_remove_dark); ((ImageView)findViewById(R.id.ResetBuilding)).setBackgroundDrawable(icon); findViewById(R.id.ResetBuilding).setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { building = null; searchPoint = null; osmandSettings.setLastSearchedBuilding("", null); //also empties Point, REMOVES intersecting street updateUI(); } }); ((ImageView)findViewById(R.id.ResetStreet)).setBackgroundDrawable(icon); findViewById(R.id.ResetStreet).setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { street = null; street2 = null; building = null; searchPoint = null; osmandSettings.setLastSearchedStreet("", null); //also empties Building, (Intersecting Street), Point updateUI(); } }); ((ImageView)findViewById(R.id.ResetCity)).setBackgroundDrawable(icon); findViewById(R.id.ResetCity).setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { postcode = null; city = null; street = null; street2 = null; building = null; searchPoint = null; osmandSettings.setLastSearchedCity(-1L, "", null); //also empties Street, (Intersecting Street), Building, Point, REMOVES Postcode updateUI(); } }); ((ImageView)findViewById(R.id.ResetCountry)).setBackgroundDrawable(icon); 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; searchPoint = null; osmandSettings.setLastSearchedRegion("", null); // also empties City, Postcode, Street, (Interseting street), Building, Point updateUI(); } }); ((RadioGroup)findViewById(R.id.RadioGroup)).setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { SearchAddressFragment.this.radioBuilding = checkedId == R.id.RadioBuilding; if(radioBuilding){ SearchAddressFragment.this.street2 = null; } else { SearchAddressFragment.this.building = null; } updateBuildingSection(); } }); } public static class AddressInformation { String objectType = ""; int zoom = 14; public String objectName =""; public PointDescription getHistoryName() { return new PointDescription(PointDescription.POINT_TYPE_ADDRESS, objectType, objectName); } public static AddressInformation build2StreetIntersection(Context ctx, OsmandSettings settings){ AddressInformation ai = new AddressInformation(); String cityName = getCityName(settings); ai.objectName = settings.getLastSearchedStreet() +" x " + settings.getLastSearchedIntersectedStreet() + " " + cityName; ai.objectType = cityName; ai.zoom = 17; return ai; } public static AddressInformation buildStreet(Context ctx, OsmandSettings settings){ AddressInformation ai = new AddressInformation(); String cityName = getCityName(settings); String street = settings.getLastSearchedStreet(); ai.objectName = street; ai.objectType = cityName; ai.zoom = 16; return ai; } public static AddressInformation buildBuilding(Context ctx, OsmandSettings settings){ AddressInformation ai = new AddressInformation(); String cityName = getCityName(settings); String street = settings.getLastSearchedStreet(); String building = settings.getLastSearchedBuilding(); ai.objectName = street + " " + building; ai.objectType = cityName; ai.zoom = 17; return ai; } private static String getCityName(OsmandSettings settings) { String postcode = settings.getLastSearchedPostcode(); String city = settings.getLastSearchedCityName(); String cityName = !Algorithms.isEmpty(postcode) ? postcode : city; return cityName; } private static String getRegionName(Context ctx, OsmandSettings settings) { OsmandApplication app = ((OsmandApplication) ctx.getApplicationContext()); RegionAddressRepository reg = app.getResourceManager().getRegionRepository(settings.getLastSearchedRegion()); if(reg != null) { return FileNameTranslationHelper.getFileName(ctx, app.getResourceManager().getOsmandRegions(), reg.getFileName()); } else { return settings.getLastSearchedRegion().replace('_', ' '); } } public static AddressInformation buildCity(Context ctx, OsmandSettings settings){ AddressInformation ai = new AddressInformation(); String city = settings.getLastSearchedCityName(); ai.objectName = city; ai.objectType = getRegionName(ctx, settings); ai.zoom = 14; return ai; } } public void select(int mode) { if (searchPoint == null) { Toast.makeText(getActivity(), R.string.please_select_address, Toast.LENGTH_SHORT).show(); return; } AddressInformation ai = new AddressInformation(); PointDescription pointDescription = ai.getHistoryName(); if (!Algorithms.isEmpty(street2) && !Algorithms.isEmpty(street)) { ai = AddressInformation.build2StreetIntersection(getActivity(), osmandSettings); pointDescription.setName(street2); pointDescription.setTypeName(getRegionName() + ", " + city); } else if (!Algorithms.isEmpty(building)) { ai = AddressInformation.buildBuilding(getActivity(), osmandSettings); pointDescription.setName(street + ", " + building); pointDescription.setTypeName(getRegionName() + ", " + city); } else if (!Algorithms.isEmpty(street)) { ai = AddressInformation.buildStreet(getActivity(), osmandSettings); pointDescription.setName(street); pointDescription.setTypeName(getRegionName() + ", " + city); } else if(!Algorithms.isEmpty(city)) { ai = AddressInformation.buildCity(getActivity(), osmandSettings); pointDescription.setName(city); pointDescription.setTypeName(getRegionName()); } if(mode == SELECT_POINT ){ Intent intent = getActivity().getIntent(); intent.putExtra(SELECT_ADDRESS_POINT_INTENT_KEY, ai.objectName); intent.putExtra(SELECT_ADDRESS_POINT_LAT, searchPoint.getLatitude()); intent.putExtra(SELECT_ADDRESS_POINT_LON, searchPoint.getLongitude()); getActivity().setResult(SELECT_ADDRESS_POINT_RESULT_OK, intent); getActivity().finish(); } else { if (mode == SHOW_ON_MAP) { osmandSettings.setMapLocationToShow(searchPoint.getLatitude(), searchPoint.getLongitude(), ai.zoom, pointDescription); MapActivity.launchMapActivityMoveToTop(getActivity()); } } } protected void updateBuildingSection(){ if(radioBuilding){ ((TextView)findViewById(R.id.BuildingText)).setText(R.string.search_address_building); if(Algorithms.isEmpty(building)){ ((TextView)findViewById(R.id.BuildingButton)).setText(R.string.choose_building); } else { ((TextView)findViewById(R.id.BuildingButton)).setText(building); } } else { ((TextView)findViewById(R.id.BuildingText)).setText(R.string.search_address_street); if(Algorithms.isEmpty(street2)){ ((TextView)findViewById(R.id.BuildingButton)).setText(R.string.choose_intersected_street); } else { ((TextView)findViewById(R.id.BuildingButton)).setText(street2); } } findViewById(R.id.ResetBuilding).setEnabled(!Algorithms.isEmpty(street2) || !Algorithms.isEmpty(building)); } private View findViewById(int resId) { return view.findViewById(resId); } protected void updateUI(){ findViewById(R.id.ResetCountry).setEnabled(!Algorithms.isEmpty(region)); if(Algorithms.isEmpty(region)){ countryButton.setText(R.string.ChooseCountry); } else { String rnname = getRegionName(); countryButton.setText(rnname); } findViewById(R.id.ResetCity).setEnabled(!Algorithms.isEmpty(city) || !Algorithms.isEmpty(postcode)); if(Algorithms.isEmpty(city) && Algorithms.isEmpty(postcode)){ cityButton.setText(R.string.choose_city); } else { if(!Algorithms.isEmpty(postcode)){ cityButton.setText(postcode); } else { cityButton.setText(city.replace('_', ' ')); } } cityButton.setEnabled(!Algorithms.isEmpty(region)); findViewById(R.id.ResetStreet).setEnabled(!Algorithms.isEmpty(street)); if(Algorithms.isEmpty(street)){ streetButton.setText(R.string.choose_street); } else { streetButton.setText(street); } streetButton.setEnabled(!Algorithms.isEmpty(city) || !Algorithms.isEmpty(postcode)); buildingButton.setEnabled(!Algorithms.isEmpty(street)); findViewById(R.id.RadioGroup).setVisibility(Algorithms.isEmpty(street) ? View.GONE : View.VISIBLE); if(radioBuilding){ ((RadioButton)findViewById(R.id.RadioBuilding)).setChecked(true); } else { ((RadioButton)findViewById(R.id.RadioIntersStreet)).setChecked(true); } updateBuildingSection(); } private String getRegionName() { RegionAddressRepository reg = getApplication().getResourceManager().getRegionRepository(region); if(reg != null) { return FileNameTranslationHelper.getFileName(getApplication(), getApplication().getResourceManager().getOsmandRegions(), reg.getFileName()); } else { return region; } } public void loadData() { if (!Algorithms.isEmpty(region)) { String postcodeStr = osmandSettings.getLastSearchedPostcode(); if (!Algorithms.isEmpty(postcodeStr)) { postcode = postcodeStr; } else { city = osmandSettings.getLastSearchedCityName(); } if (!Algorithms.isEmpty(postcode) || !Algorithms.isEmpty(city)) { street = osmandSettings.getLastSearchedStreet(); if (!Algorithms.isEmpty(street)) { String str = osmandSettings.getLastSearchedIntersectedStreet(); radioBuilding = Algorithms.isEmpty(str); if (!radioBuilding) { street2 = str; } else { building = osmandSettings.getLastSearchedBuilding(); } } } } } @Override public void onResume() { super.onResume(); searchPoint = osmandSettings.getLastSearchedPoint(); region = null; postcode = null; city = null; street = null; building = null; region = osmandSettings.getLastSearchedRegion(); loadData(); updateUI(); } }