package net.osmand.core.samples.android.sample1.search; import android.annotation.SuppressLint; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import net.osmand.AndroidUtils; import net.osmand.Location; import net.osmand.ResultMatcher; import net.osmand.core.samples.android.sample1.MainActivity; import net.osmand.core.samples.android.sample1.R; import net.osmand.core.samples.android.sample1.SampleApplication; import net.osmand.core.samples.android.sample1.SampleFormatter; import net.osmand.core.samples.android.sample1.SampleLocationProvider.SampleCompassListener; import net.osmand.core.samples.android.sample1.SampleLocationProvider.SampleLocationListener; import net.osmand.core.samples.android.sample1.data.PointDescription; import net.osmand.data.LatLon; import net.osmand.osm.PoiCategory; import net.osmand.search.SearchUICore; import net.osmand.search.SearchUICore.SearchResultCollection; import net.osmand.search.core.ObjectType; import net.osmand.search.core.SearchCoreAPI; import net.osmand.search.core.SearchCoreFactory.SearchAmenityTypesAPI; import net.osmand.search.core.SearchPhrase; import net.osmand.search.core.SearchResult; import net.osmand.search.core.SearchSettings; import net.osmand.search.core.SearchWord; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import java.io.IOException; import java.util.ArrayList; import java.util.List; import static net.osmand.search.core.SearchCoreFactory.SEARCH_AMENITY_TYPE_PRIORITY; public class QuickSearchDialogFragment extends DialogFragment implements SampleCompassListener, SampleLocationListener { public static final String TAG = "QuickSearchDialogFragment"; private static final String QUICK_SEARCH_QUERY_KEY = "quick_search_query_key"; private static final String QUICK_SEARCH_LAT_KEY = "quick_search_lat_key"; private static final String QUICK_SEARCH_LON_KEY = "quick_search_lon_key"; private static final String QUICK_SEARCH_INTERRUPTED_SEARCH_KEY = "quick_search_interrupted_search_key"; private static final String QUICK_SEARCH_SHOW_CATEGORIES_KEY = "quick_search_show_categories_key"; private static final String QUICK_SEARCH_HIDDEN_KEY = "quick_search_hidden_key"; private static final String QUICK_SEARCH_TOOLBAR_TITLE_KEY = "quick_search_toolbar_title_key"; private static final String QUICK_SEARCH_TOOLBAR_VISIBLE_KEY = "quick_search_toolbar_visible_key"; private static final String QUICK_SEARCH_RUN_SEARCH_FIRST_TIME_KEY = "quick_search_run_search_first_time_key"; private static final String QUICK_SEARCH_PHRASE_DEFINED_KEY = "quick_search_phrase_defined_key"; private Toolbar toolbar; private View searchView; private View categoriesView; private View buttonToolbarView; private ImageView buttonToolbarImage; private TextView buttonToolbarText; private QuickSearchMainListFragment mainSearchFragment; private QuickSearchCategoriesListFragment categoriesSearchFragment; //private QuickSearchToolbarController toolbarController; private EditText searchEditText; private ProgressBar progressBar; private ImageButton clearButton; private SampleApplication app; private QuickSearchHelper searchHelper; private SearchUICore searchUICore; private String searchQuery; private LatLon centerLatLon; private Location location = null; private Float heading = null; private boolean useMapCenter; private boolean paused; private boolean cancelPrev; private boolean searching; private boolean hidden; private String toolbarTitle; private boolean toolbarVisible; private boolean newSearch; private boolean interruptedSearch; private long hideTimeMs; private boolean runSearchFirstTime; private boolean phraseDefined; private static final double DISTANCE_THRESHOLD = 70000; // 70km private static final int EXPIRATION_TIME_MIN = 10; // 10 minutes @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); app = getMyApplication(); setStyle(STYLE_NO_FRAME, R.style.AppTheme); } @Override @SuppressLint("PrivateResource, ValidFragment") public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final MainActivity mainActivity = getMainActivity(); final View view = inflater.inflate(R.layout.search_dialog_fragment, container, false); /* toolbarController = new QuickSearchToolbarController(); toolbarController.setOnBackButtonClickListener(new OnClickListener() { @Override public void onClick(View v) { mainActivity.showQuickSearch(ShowQuickSearchMode.CURRENT, false); } }); toolbarController.setOnTitleClickListener(new OnClickListener() { @Override public void onClick(View v) { mainActivity.showQuickSearch(ShowQuickSearchMode.CURRENT, false); } }); toolbarController.setOnCloseButtonClickListener(new OnClickListener() { @Override public void onClick(View v) { mainActivity.closeQuickSearch(); } }); */ Bundle arguments = getArguments(); if (savedInstanceState != null) { searchQuery = savedInstanceState.getString(QUICK_SEARCH_QUERY_KEY); double lat = savedInstanceState.getDouble(QUICK_SEARCH_LAT_KEY, Double.NaN); double lon = savedInstanceState.getDouble(QUICK_SEARCH_LON_KEY, Double.NaN); if (!Double.isNaN(lat) && !Double.isNaN(lon)) { centerLatLon = new LatLon(lat, lon); } interruptedSearch = savedInstanceState.getBoolean(QUICK_SEARCH_INTERRUPTED_SEARCH_KEY, false); hidden = savedInstanceState.getBoolean(QUICK_SEARCH_HIDDEN_KEY, false); toolbarTitle = savedInstanceState.getString(QUICK_SEARCH_TOOLBAR_TITLE_KEY); toolbarVisible = savedInstanceState.getBoolean(QUICK_SEARCH_TOOLBAR_VISIBLE_KEY, false); } if (searchQuery == null && arguments != null) { searchQuery = arguments.getString(QUICK_SEARCH_QUERY_KEY); runSearchFirstTime = arguments.getBoolean(QUICK_SEARCH_RUN_SEARCH_FIRST_TIME_KEY, false); phraseDefined = arguments.getBoolean(QUICK_SEARCH_PHRASE_DEFINED_KEY, false); double lat = arguments.getDouble(QUICK_SEARCH_LAT_KEY, Double.NaN); double lon = arguments.getDouble(QUICK_SEARCH_LON_KEY, Double.NaN); if (!Double.isNaN(lat) && !Double.isNaN(lon)) { centerLatLon = new LatLon(lat, lon); } newSearch = true; } if (searchQuery == null) searchQuery = ""; boolean showCategories = false; if (arguments != null) { showCategories = arguments.getBoolean(QUICK_SEARCH_SHOW_CATEGORIES_KEY, false); } searchView = view.findViewById(R.id.search_view); categoriesView = view.findViewById(R.id.categories_view); buttonToolbarView = view.findViewById(R.id.button_toolbar_layout); buttonToolbarImage = (ImageView) view.findViewById(R.id.buttonToolbarImage); buttonToolbarImage.setImageDrawable(app.getIconsCache().getThemedIcon("ic_action_marker_dark")); buttonToolbarText = (TextView) view.findViewById(R.id.buttonToolbarTitle); view.findViewById(R.id.buttonToolbar).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { SearchPhrase searchPhrase = searchUICore.getPhrase(); SearchWord word = searchPhrase.getLastSelectedWord(); if (word != null && word.getLocation() != null) { SearchResult searchResult = word.getResult(); String name = QuickSearchListItem.getName(app, searchResult); String typeName = QuickSearchListItem.getTypeName(app, searchResult); PointDescription pointDescription = new PointDescription(PointDescription.POINT_TYPE_ADDRESS, typeName, name); mainActivity.showOnMap(searchResult.location, searchResult.preferredZoom); mainActivity.getContextMenu().show(searchResult.location, pointDescription, searchResult.object); hide(); } } } ); toolbar = (Toolbar) view.findViewById(R.id.toolbar); toolbar.setNavigationIcon(app.getIconsCache().getThemedIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha)); toolbar.setNavigationContentDescription(app.getString("access_shared_string_navigate_up")); toolbar.setNavigationOnClickListener( new OnClickListener() { @Override public void onClick(View v) { dismiss(); } } ); searchEditText = (EditText) view.findViewById(R.id.searchEditText); searchEditText.addTextChangedListener( new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { String newQueryText = s.toString(); updateClearButtonAndHint(); updateClearButtonVisibility(true); boolean textEmpty = newQueryText.length() == 0; updateViewsVisibility(textEmpty); if (!searchQuery.equalsIgnoreCase(newQueryText)) { searchQuery = newQueryText; if (Algorithms.isEmpty(searchQuery)) { searchUICore.resetPhrase(); } else { runSearch(); } } else if (runSearchFirstTime) { runSearchFirstTime = false; runSearch(); } } } ); progressBar = (ProgressBar) view.findViewById(R.id.searchProgressBar); clearButton = (ImageButton) view.findViewById(R.id.clearButton); clearButton.setImageDrawable(app.getIconsCache().getThemedIcon(R.drawable.ic_action_remove_dark)); clearButton.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { if (searchEditText.getText().length() > 0) { String newText = searchUICore.getPhrase().getTextWithoutLastWord(); searchEditText.setText(newText); searchEditText.setSelection(newText.length()); } else if (useMapCenter && location != null) { useMapCenter = false; centerLatLon = null; updateUseMapCenterUI(); LatLon centerLatLon = new LatLon(location.getLatitude(), location.getLongitude()); SearchSettings ss = searchUICore.getSearchSettings().setOriginalLocation( new LatLon(centerLatLon.getLatitude(), centerLatLon.getLongitude())); searchUICore.updateSettings(ss); updateClearButtonAndHint(); updateClearButtonVisibility(true); startLocationUpdate(); } updateToolbarButton(); } } ); setupSearch(mainActivity); return view; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); updateToolbarButton(); updateClearButtonAndHint(); updateClearButtonVisibility(true); addCategoriesFragment(); addMainSearchFragment(); if (centerLatLon == null) { searchEditText.requestFocus(); AndroidUtils.softKeyboardDelayed(searchEditText); } } public void restoreToolbar() { if (toolbarVisible) { if (toolbarTitle != null) { showToolbar(toolbarTitle); } else { showToolbar(); } } } public void showToolbar() { showToolbar(getText()); } public void showToolbar(String title) { toolbarVisible = true; toolbarTitle = title; //todo //toolbarController.setTitle(toolbarTitle); //getMainActivity().showTopToolbar(toolbarController); } public void hideToolbar() { toolbarVisible = false; //getMainActivity().hideTopToolbar(toolbarController); todo } public String getText() { return searchEditText.getText().toString(); } public void hideKeyboard() { if (searchEditText.hasFocus()) { AndroidUtils.hideSoftKeyboard(getActivity(), searchEditText); } } public boolean isSearchHidden() { return hidden; } public boolean isExpired() { return hideTimeMs > 0 && System.currentTimeMillis() - hideTimeMs > EXPIRATION_TIME_MIN * 60 * 1000; } public void show() { if (useMapCenter) { LatLon mapCenter = getMainActivity().getScreenCenter(); SearchSettings ss = searchUICore.getSearchSettings().setOriginalLocation( new LatLon(mapCenter.getLatitude(), mapCenter.getLongitude())); searchUICore.updateSettings(ss); updateUseMapCenterUI(); updateLocationUI(mapCenter, null); } getDialog().show(); paused = false; hidden = false; if (interruptedSearch) { interruptedSearch = false; addMoreButton(); } } public void hide() { paused = true; hidden = true; hideTimeMs = System.currentTimeMillis(); interruptedSearch = searching; searching = false; hideProgressBar(); updateClearButtonVisibility(true); getDialog().hide(); } public void closeSearch() { dismiss(); } public void addMainSearchFragment() { mainSearchFragment = (QuickSearchMainListFragment) Fragment.instantiate(this.getContext(), QuickSearchMainListFragment.class.getName()); FragmentManager childFragMan = getChildFragmentManager(); FragmentTransaction childFragTrans = childFragMan.beginTransaction(); childFragTrans.replace(R.id.search_view, mainSearchFragment); childFragTrans.commit(); } public void addCategoriesFragment() { categoriesSearchFragment = (QuickSearchCategoriesListFragment) Fragment.instantiate(this.getContext(), QuickSearchCategoriesListFragment.class.getName()); FragmentManager childFragMan = getChildFragmentManager(); FragmentTransaction childFragTrans = childFragMan.beginTransaction(); childFragTrans.replace(R.id.categories_view, categoriesSearchFragment); childFragTrans.commit(); } private void updateToolbarButton() { SearchWord word = searchUICore.getPhrase().getLastSelectedWord(); if (word != null && word.getLocation() != null) { if (searchEditText.getText().length() > 0) { if (word.getResult() != null) { buttonToolbarText.setText(app.getString("show_something_on_map", word.getResult().localeName).toUpperCase()); } else { buttonToolbarText.setText(app.getString("shared_string_show_on_map").toUpperCase()); } } else { buttonToolbarText.setText(app.getString("shared_string_show_on_map").toUpperCase()); } buttonToolbarView.setVisibility(View.VISIBLE); } else { buttonToolbarView.setVisibility(View.GONE); } } private void setupSearch(final MainActivity mainActivity) { // Setup search core String locale = ""; //app.getSettings().MAP_PREFERRED_LOCALE.get(); boolean transliterate = false; //app.getSettings().MAP_TRANSLITERATE_NAMES.get(); searchHelper = app.getSearchUICore(); searchUICore = searchHelper.getCore(); if (newSearch) { setResultCollection(null); if (!phraseDefined) { searchUICore.resetPhrase(); } phraseDefined = false; } location = app.getLocationProvider().getLastKnownLocation(); LatLon searchLatLon; if (centerLatLon == null) { LatLon clt = mainActivity.getScreenCenter(); searchLatLon = clt; searchEditText.setHint(app.getString("search_poi_category_hint")); if (location != null) { double d = MapUtils.getDistance(clt, location.getLatitude(), location.getLongitude()); if (d < DISTANCE_THRESHOLD) { searchLatLon = new LatLon(location.getLatitude(), location.getLongitude()); } else { useMapCenter = true; } } else { useMapCenter = true; } } else { searchLatLon = centerLatLon; useMapCenter = true; } SearchSettings settings = searchUICore.getSearchSettings().setOriginalLocation( new LatLon(searchLatLon.getLatitude(), searchLatLon.getLongitude())); settings = settings.setLang(locale, transliterate); searchUICore.updateSettings(settings); searchUICore.setOnSearchStart(new Runnable() { @Override public void run() { cancelPrev = false; } }); searchUICore.setOnResultsComplete(new Runnable() { @Override public void run() { app.runInUIThread(new Runnable() { @Override public void run() { searching = false; if (!paused && !cancelPrev) { hideProgressBar(); if (searchUICore.isSearchMoreAvailable(searchUICore.getPhrase())) { addMoreButton(); } } } }); } }); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setShowsDialog(true); } @Override public void onSaveInstanceState(Bundle outState) { outState.putString(QUICK_SEARCH_QUERY_KEY, searchQuery); outState.putBoolean(QUICK_SEARCH_INTERRUPTED_SEARCH_KEY, interruptedSearch = searching); outState.putBoolean(QUICK_SEARCH_HIDDEN_KEY, hidden); if (toolbarTitle != null) { outState.putString(QUICK_SEARCH_TOOLBAR_TITLE_KEY, toolbarTitle); } outState.putBoolean(QUICK_SEARCH_TOOLBAR_VISIBLE_KEY, toolbarVisible); if (centerLatLon != null) { outState.putDouble(QUICK_SEARCH_LAT_KEY, centerLatLon.getLatitude()); outState.putDouble(QUICK_SEARCH_LON_KEY, centerLatLon.getLongitude()); } } @Override public void onResume() { super.onResume(); if (!useMapCenter) { startLocationUpdate(); } paused = false; } @Override public void onPause() { super.onPause(); paused = true; hideTimeMs = System.currentTimeMillis(); stopLocationUpdate(); hideProgressBar(); } @Override public void onDismiss(DialogInterface dialog) { MainActivity mainActivity = getMainActivity(); if (mainActivity != null) { hideToolbar(); getChildFragmentManager().popBackStack(); } super.onDismiss(dialog); } public Toolbar getToolbar() { return toolbar; } public boolean isUseMapCenter() { return useMapCenter; } private void startLocationUpdate() { app.getLocationProvider().addCompassListener(this); app.getLocationProvider().addLocationListener(this); location = app.getLocationProvider().getLastKnownLocation(); updateLocation(location); } private void stopLocationUpdate() { app.getLocationProvider().removeLocationListener(this); app.getLocationProvider().removeCompassListener(this); } private void showProgressBar() { updateClearButtonVisibility(false); progressBar.setVisibility(View.VISIBLE); } private void hideProgressBar() { updateClearButtonVisibility(true); progressBar.setVisibility(View.GONE); } private void updateClearButtonAndHint() { if (useMapCenter && location != null && searchEditText.length() == 0) { LatLon latLon = searchUICore.getSearchSettings().getOriginalLocation(); double d = MapUtils.getDistance(latLon, location.getLatitude(), location.getLongitude()); String dist = SampleFormatter.getFormattedDistance((float) d, app); searchEditText.setHint(app.getString("dist_away_from_my_location", dist)); clearButton.setImageDrawable(app.getIconsCache().getIcon("ic_action_get_my_location", R.color.color_myloc_distance)); } else { searchEditText.setHint(app.getString("search_poi_category_hint")); clearButton.setImageDrawable(app.getIconsCache().getThemedIcon(R.drawable.ic_action_remove_dark)); } } private void updateClearButtonVisibility(boolean show) { if (show) { clearButton.setVisibility(searchEditText.length() > 0 || (useMapCenter && location != null) ? View.VISIBLE : View.GONE); } else { clearButton.setVisibility(View.GONE); } } private void updateViewsVisibility(boolean show) { if (show) { buttonToolbarView.setVisibility(View.GONE); searchView.setVisibility(View.GONE); categoriesView.setVisibility(View.VISIBLE); } else { buttonToolbarView.setVisibility(View.VISIBLE); searchView.setVisibility(View.VISIBLE); categoriesView.setVisibility(View.GONE); } } public void setResultCollection(SearchResultCollection resultCollection) { searchHelper.setResultCollection(resultCollection); } public SearchResultCollection getResultCollection() { return searchHelper.getResultCollection(); } public void onSearchListFragmentResume(QuickSearchListFragment searchListFragment) { switch (searchListFragment.getType()) { case CATEGORIES: reloadCategories(); break; case MAIN: if (!Algorithms.isEmpty(searchQuery)) { searchEditText.setText(searchQuery); searchEditText.setSelection(searchQuery.length()); } if (getResultCollection() != null) { updateSearchResult(getResultCollection(), false); if (interruptedSearch || searchUICore.isSearchMoreAvailable(searchUICore.getPhrase())) { addMoreButton(); } } break; } LatLon mapCenter = getMainActivity().getScreenCenter(); if (useMapCenter) { updateUseMapCenterUI(); searchListFragment.updateLocation(mapCenter, null); } } public void reloadCategories() { try { SearchResultCollection res = searchUICore.shallowSearch(SearchAmenityTypesAPI.class, "", null); if (res != null) { List<QuickSearchListItem> rows = new ArrayList<>(); for (SearchResult sr : res.getCurrentSearchResults()) { rows.add(new QuickSearchListItem(app, sr)); } categoriesSearchFragment.updateListAdapter(rows, false); } } catch (IOException e) { e.printStackTrace(); } } private void runSearch() { runSearch(searchQuery); } private void runSearch(String text) { showProgressBar(); SearchSettings settings = searchUICore.getPhrase().getSettings(); if (settings.getRadiusLevel() != 1) { searchUICore.updateSettings(settings.setRadiusLevel(1)); } runCoreSearch(text, true, false); } private void runCoreSearch(final String text, final boolean updateResult, final boolean searchMore) { showProgressBar(); updateToolbarButton(); interruptedSearch = false; searching = true; cancelPrev = true; runCoreSearchInternal(text, updateResult, searchMore); } private void runCoreSearchInternal(String text, boolean updateResult, boolean searchMore) { SearchResultCollection c = searchUICore.search(text, updateResult, new ResultMatcher<SearchResult>() { SearchResultCollection regionResultCollection = null; SearchCoreAPI regionResultApi = null; List<SearchResult> results = new ArrayList<>(); @Override public boolean publish(SearchResult object) { if (paused || cancelPrev) { if (results.size() > 0) { getResultCollection().addSearchResults(results, true, true); } return false; } switch (object.objectType) { case SEARCH_API_FINISHED: final SearchCoreAPI searchApi = (SearchCoreAPI) object.object; final List<SearchResult> apiResults; final SearchPhrase phrase = object.requiredSearchPhrase; final SearchCoreAPI regionApi = regionResultApi; final SearchResultCollection regionCollection = regionResultCollection; final boolean hasRegionCollection = (searchApi == regionApi && regionCollection != null); if (hasRegionCollection) { apiResults = regionCollection.getCurrentSearchResults(); } else { apiResults = results; } regionResultApi = null; regionResultCollection = null; results = new ArrayList<>(); showApiResults(apiResults, phrase, hasRegionCollection); break; case SEARCH_API_REGION_FINISHED: regionResultApi = (SearchCoreAPI) object.object; final SearchPhrase regionPhrase = object.requiredSearchPhrase; regionResultCollection = new SearchResultCollection(regionPhrase).addSearchResults(results, true, true); showRegionResults(regionResultCollection); break; case PARTIAL_LOCATION: break; default: results.add(object); } return false; } @Override public boolean isCancelled() { return paused || cancelPrev; } }); if (!searchMore) { setResultCollection(null); if (!updateResult) { updateSearchResult(null, false); } } if (updateResult) { updateSearchResult(c, false); } } private void showApiResults(final List<SearchResult> apiResults, final SearchPhrase phrase, final boolean hasRegionCollection) { app.runInUIThread(new Runnable() { @Override public void run() { if (!paused && !cancelPrev) { boolean append = getResultCollection() != null; if (append) { getResultCollection().addSearchResults(apiResults, true, true); } else { SearchResultCollection resCollection = new SearchResultCollection(phrase); resCollection.addSearchResults(apiResults, true, true); setResultCollection(resCollection); } if (!hasRegionCollection) { updateSearchResult(getResultCollection(), append); } } } }); } private void showRegionResults(final SearchResultCollection regionResultCollection) { app.runInUIThread(new Runnable() { @Override public void run() { if (!paused && !cancelPrev) { if (getResultCollection() != null) { SearchResultCollection resCollection = getResultCollection().combineWithCollection(regionResultCollection, true, true); updateSearchResult(resCollection, true); } else { updateSearchResult(regionResultCollection, false); } } } }); } public void completeQueryWithObject(SearchResult sr) { searchUICore.selectSearchResult(sr); String txt = searchUICore.getPhrase().getText(true); searchQuery = txt; searchEditText.setText(txt); searchEditText.setSelection(txt.length()); updateToolbarButton(); SearchSettings settings = searchUICore.getPhrase().getSettings(); if (settings.getRadiusLevel() != 1) { searchUICore.updateSettings(settings.setRadiusLevel(1)); } runCoreSearch(txt, false, false); } public void clearLastWord() { if (searchEditText.getText().length() > 0) { String newText = searchUICore.getPhrase().getTextWithoutLastWord(); searchEditText.setText(newText); searchEditText.setSelection(newText.length()); } } private void addMoreButton() { QuickSearchMoreListItem moreListItem = new QuickSearchMoreListItem(app, app.getString("search_POI_level_btn").toUpperCase(), new OnClickListener() { @Override public void onClick(View v) { if (!interruptedSearch) { SearchSettings settings = searchUICore.getPhrase().getSettings(); searchUICore.updateSettings(settings.setRadiusLevel(settings.getRadiusLevel() + 1)); } runCoreSearch(searchQuery, false, true); } }); if (!paused && !cancelPrev && mainSearchFragment != null) { mainSearchFragment.addListItem(moreListItem); } } private void updateSearchResult(SearchResultCollection res, boolean append) { if (!paused && mainSearchFragment != null) { List<QuickSearchListItem> rows = new ArrayList<>(); if (res != null && res.getCurrentSearchResults().size() > 0) { for (final SearchResult sr : res.getCurrentSearchResults()) { rows.add(new QuickSearchListItem(app, sr)); } } mainSearchFragment.updateListAdapter(rows, append); } } public static boolean showInstance(@NonNull MainActivity mainActivity, @NonNull String searchQuery, @Nullable Object object, boolean showCategories, @Nullable LatLon latLon) { try { Bundle bundle = new Bundle(); if (object != null) { bundle.putBoolean(QUICK_SEARCH_RUN_SEARCH_FIRST_TIME_KEY, true); String objectLocalizedName = searchQuery; if (object instanceof PoiCategory) { PoiCategory c = (PoiCategory) object; objectLocalizedName = c.getTranslation(); SearchUICore searchUICore = mainActivity.getMyApplication().getSearchUICore().getCore(); SearchPhrase phrase = searchUICore.resetPhrase(objectLocalizedName + " "); SearchResult sr = new SearchResult(phrase); sr.localeName = objectLocalizedName; sr.object = c; sr.priority = SEARCH_AMENITY_TYPE_PRIORITY; sr.priorityDistance = 0; sr.objectType = ObjectType.POI_TYPE; searchUICore.selectSearchResult(sr); bundle.putBoolean(QUICK_SEARCH_PHRASE_DEFINED_KEY, true); } searchQuery = objectLocalizedName.trim() + " "; } else if (!Algorithms.isEmpty(searchQuery)) { bundle.putBoolean(QUICK_SEARCH_RUN_SEARCH_FIRST_TIME_KEY, true); } bundle.putString(QUICK_SEARCH_QUERY_KEY, searchQuery); bundle.putBoolean(QUICK_SEARCH_SHOW_CATEGORIES_KEY, showCategories); if (latLon != null) { bundle.putDouble(QUICK_SEARCH_LAT_KEY, latLon.getLatitude()); bundle.putDouble(QUICK_SEARCH_LON_KEY, latLon.getLongitude()); } QuickSearchDialogFragment fragment = new QuickSearchDialogFragment(); fragment.setArguments(bundle); fragment.show(mainActivity.getSupportFragmentManager(), TAG); return true; } catch (RuntimeException e) { return false; } } private MainActivity getMainActivity() { return (MainActivity) getActivity(); } private SampleApplication getMyApplication() { return (SampleApplication) getActivity().getApplication(); } @Override public void updateCompassValue(final float value) { // 99 in next line used to one-time initialize arrows (with reference vs. fixed-north direction) // on non-compass devices float lastHeading = heading != null ? heading : 99; heading = value; if (Math.abs(MapUtils.degreesDiff(lastHeading, heading)) > 5) { final Location location = this.location; app.runInUIThread(new Runnable() { @Override public void run() { updateLocationUI(location, value); } }); } else { heading = lastHeading; } } @Override public void updateLocation(final Location location) { final Float heading = this.heading; app.runInUIThread(new Runnable() { @Override public void run() { updateLocationUI(location, heading); } }); } private void updateLocationUI(Location location, Float heading) { this.location = location; LatLon latLon = null; if (location != null) { latLon = new LatLon(location.getLatitude(), location.getLongitude()); } updateLocationUI(latLon, heading); } private void updateLocationUI(LatLon latLon, Float heading) { if (latLon != null && !paused && !cancelPrev) { if (mainSearchFragment != null && searchView.getVisibility() == View.VISIBLE) { mainSearchFragment.updateLocation(latLon, heading); } else if (categoriesSearchFragment != null) { categoriesSearchFragment.updateLocation(latLon, heading); } } } private void updateUseMapCenterUI() { if (!paused && !cancelPrev) { if (mainSearchFragment != null) { mainSearchFragment.getListAdapter().setUseMapCenter(useMapCenter); } if (categoriesSearchFragment != null) { categoriesSearchFragment.getListAdapter().setUseMapCenter(useMapCenter); } } } public static class QuickSearchCategoriesListFragment extends QuickSearchListFragment { @Override public SearchListFragmentType getType() { return SearchListFragmentType.CATEGORIES; } } public static class QuickSearchMainListFragment extends QuickSearchListFragment { @Override public SearchListFragmentType getType() { return SearchListFragmentType.MAIN; } } /* public static class QuickSearchToolbarController extends TopToolbarController { public QuickSearchToolbarController() { super(TopToolbarControllerType.QUICK_SEARCH); } } */ }