package net.osmand.core.samples.android.sample1.search;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
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.SampleUtils;
import net.osmand.core.samples.android.sample1.data.PointDescription;
import net.osmand.data.Amenity;
import net.osmand.data.City;
import net.osmand.data.LatLon;
import net.osmand.data.Street;
import net.osmand.search.core.ObjectType;
import net.osmand.search.core.SearchResult;
import net.osmand.util.Algorithms;
import java.util.List;
public abstract class QuickSearchListFragment extends ListFragment {
private QuickSearchDialogFragment dialogFragment;
private QuickSearchListAdapter listAdapter;
private boolean touching;
private boolean scrolling;
enum SearchListFragmentType {
CATEGORIES,
MAIN
}
public abstract SearchListFragmentType getType();
public SampleApplication getMyApplication() {
return (SampleApplication) getActivity().getApplication();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.search_dialog_list_layout, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ListView listView = getListView();
if (listView != null) {
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
scrolling = (scrollState != AbsListView.OnScrollListener.SCROLL_STATE_IDLE);
if (scrolling) {
dialogFragment.hideKeyboard();
}
}
});
View header = getLayoutInflater(savedInstanceState).inflate(R.layout.list_shadow_header, null);
View footer = getLayoutInflater(savedInstanceState).inflate(R.layout.list_shadow_footer, null);
listView.addHeaderView(header, null, false);
listView.addFooterView(footer, null, false);
}
}
@Override
public void onListItemClick(ListView l, View view, int position, long id) {
int index = position - l.getHeaderViewsCount();
if (index < listAdapter.getCount()) {
QuickSearchListItem item = listAdapter.getItem(index);
if (item != null) {
if (item instanceof QuickSearchMoreListItem) {
((QuickSearchMoreListItem) item).getOnClickListener().onClick(view);
} else {
SearchResult sr = item.getSearchResult();
if (sr.objectType == ObjectType.POI
|| sr.objectType == ObjectType.LOCATION
|| sr.objectType == ObjectType.HOUSE
|| sr.objectType == ObjectType.FAVORITE
|| sr.objectType == ObjectType.RECENT_OBJ
|| sr.objectType == ObjectType.WPT
|| sr.objectType == ObjectType.STREET_INTERSECTION) {
showOnMap(sr);
} else {
dialogFragment.completeQueryWithObject(item.getSearchResult());
}
}
}
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dialogFragment = (QuickSearchDialogFragment) getParentFragment();
listAdapter = new QuickSearchListAdapter(getMyApplication(), getActivity());
listAdapter.setUseMapCenter(dialogFragment.isUseMapCenter());
setListAdapter(listAdapter);
ListView listView = getListView();
listView.setBackgroundColor(getResources().getColor(R.color.ctx_menu_info_view_bg_light));
listView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
touching = true;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
touching = false;
break;
}
return false;
}
});
}
@Override
public QuickSearchListAdapter getListAdapter() {
return listAdapter;
}
public ArrayAdapter<?> getAdapter() {
return listAdapter;
}
public QuickSearchDialogFragment getDialogFragment() {
return dialogFragment;
}
@Override
public void onResume() {
super.onResume();
int screenOrientation = SampleUtils.getScreenOrientation(getActivity());
listAdapter.setScreenOrientation(screenOrientation);
dialogFragment.onSearchListFragmentResume(this);
}
private void showOnMap(SearchResult searchResult) {
if (searchResult.location != null) {
SampleApplication app = getMyApplication();
String lang = searchResult.requiredSearchPhrase.getSettings().getLang();
boolean transliterate = searchResult.requiredSearchPhrase.getSettings().isTransliterate();
PointDescription pointDescription = null;
Object object = searchResult.object;
switch (searchResult.objectType) {
case POI:
Amenity a = (Amenity) object;
String poiSimpleFormat = SampleFormatter.getPoiStringWithoutType(a, lang, transliterate);
pointDescription = new PointDescription(PointDescription.POINT_TYPE_POI, poiSimpleFormat);
pointDescription.setIconName(QuickSearchListItem.getAmenityIconName(a));
break;
case HOUSE:
String typeNameHouse = null;
String name = searchResult.localeName;
if (searchResult.relatedObject instanceof City) {
name = ((City) searchResult.relatedObject).getName(searchResult.requiredSearchPhrase.getSettings().getLang(), true) + " " + name;
} else if (searchResult.relatedObject instanceof Street) {
String s = ((Street) searchResult.relatedObject).getName(searchResult.requiredSearchPhrase.getSettings().getLang(), true);
typeNameHouse = ((Street) searchResult.relatedObject).getCity().getName(searchResult.requiredSearchPhrase.getSettings().getLang(), true);
name = s + " " + name;
} else if (searchResult.localeRelatedObjectName != null) {
name = searchResult.localeRelatedObjectName + " " + name;
}
pointDescription = new PointDescription(PointDescription.POINT_TYPE_ADDRESS, typeNameHouse, name);
pointDescription.setIconName("ic_action_building");
break;
case LOCATION:
pointDescription = new PointDescription(
searchResult.location.getLatitude(), searchResult.location.getLongitude());
pointDescription.setIconName("ic_action_world_globe");
break;
case STREET_INTERSECTION:
String typeNameIntersection = QuickSearchListItem.getTypeName(app, searchResult);
if (Algorithms.isEmpty(typeNameIntersection)) {
typeNameIntersection = null;
}
pointDescription = new PointDescription(PointDescription.POINT_TYPE_ADDRESS,
typeNameIntersection, QuickSearchListItem.getName(app, searchResult));
pointDescription.setIconName("ic_action_intersection");
break;
}
dialogFragment.hideToolbar();
dialogFragment.hide();
getMainActivity().showOnMap(searchResult.location, searchResult.preferredZoom);
getMainActivity().getContextMenu().show(searchResult.location, pointDescription, object);
}
}
public MainActivity getMainActivity() {
return (MainActivity) getActivity();
}
public void updateLocation(LatLon latLon, Float heading) {
if (listAdapter != null && !touching && !scrolling) {
listAdapter.setLocation(latLon);
listAdapter.setHeading(heading);
listAdapter.notifyDataSetChanged();
}
}
public void updateListAdapter(List<QuickSearchListItem> listItems, boolean append) {
if (listAdapter != null) {
listAdapter.setListItems(listItems);
if (!append) {
getListView().setSelection(0);
}
}
}
public void addListItem(QuickSearchListItem listItem) {
if (listItem != null) {
listAdapter.addListItem(listItem);
}
}
}