/**
*
*/
package net.osmand.plus.activities;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewCompat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.plus.OsmAndLocationProvider.OsmAndCompassListener;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.search.SearchActivity;
import net.osmand.plus.activities.search.SearchActivity.SearchActivityChild;
import net.osmand.plus.base.FavoriteImageDrawable;
import net.osmand.plus.base.OsmAndListFragment;
import net.osmand.plus.dashboard.DashLocationFragment;
import net.osmand.util.MapUtils;
import java.util.Comparator;
import java.util.List;
public class FavoritesListFragment extends OsmAndListFragment implements SearchActivityChild, OsmAndCompassListener {
public static final String SELECT_FAVORITE_POINT_INTENT_KEY = "SELECT_FAVORITE_POINT_INTENT_KEY";
public static final int SELECT_FAVORITE_POINT_RESULT_OK = 1;
private FavouritesAdapter favouritesAdapter;
private boolean selectFavoriteMode;
private OsmandSettings settings;
private boolean compassRegistered;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Intent intent = activity.getIntent();
settings = getApplication().getSettings();
OsmandApplication app = getApplication();
favouritesAdapter = new FavouritesAdapter(activity, app.getFavorites().getFavouritePoints(),
false);
setListAdapter(favouritesAdapter);
setHasOptionsMenu(true);
if (intent != null) {
selectFavoriteMode = intent.hasExtra(SELECT_FAVORITE_POINT_INTENT_KEY);
if (intent.hasExtra(SearchActivity.SEARCH_LAT) && intent.hasExtra(SearchActivity.SEARCH_LON)) {
double lat = intent.getDoubleExtra(SearchActivity.SEARCH_LAT, 0);
double lon = intent.getDoubleExtra(SearchActivity.SEARCH_LON, 0);
if (lat != 0 || lon != 0) {
favouritesAdapter.location = new LatLon(lat, lon);
}
}
}
}
@Override
public ArrayAdapter<?> getAdapter() {
return favouritesAdapter;
}
private OsmandApplication getApplication() {
return (OsmandApplication) getActivity().getApplication();
}
@Override
public void onResume() {
super.onResume();
if (favouritesAdapter.location == null && getActivity() instanceof SearchActivity) {
favouritesAdapter.location = ((SearchActivity) getActivity()).getSearchPoint();
}
if (favouritesAdapter.location == null) {
favouritesAdapter.location = settings.getLastKnownMapLocation();
}
favouritesAdapter.screenOrientation = DashLocationFragment.getScreenOrientation(getActivity());
locationUpdate(favouritesAdapter.location);
}
@Override
public void locationUpdate(LatLon l) {
if (getActivity() instanceof SearchActivity) {
if (((SearchActivity) getActivity()).isSearchAroundCurrentLocation() && l != null) {
if (!compassRegistered) {
OsmandApplication app = getMyApplication();
app.getLocationProvider().removeCompassListener(app.getLocationProvider().getNavigationInfo());
app.getLocationProvider().addCompassListener(this);
compassRegistered = true;
}
favouritesAdapter.searchAroundLocation = true;
} else {
favouritesAdapter.searchAroundLocation = false;
}
}
if (favouritesAdapter != null) {
favouritesAdapter.updateLocation(l);
}
}
@Override
public void onPause() {
super.onPause();
if(getActivity() instanceof SearchActivity) {
OsmandApplication app = getMyApplication();
app.getLocationProvider().removeCompassListener(this);
app.getLocationProvider().addCompassListener(app.getLocationProvider().getNavigationInfo());
compassRegistered = false;
}
}
public boolean isSelectFavoriteMode() {
return selectFavoriteMode;
}
@Override
public void onCreateOptionsMenu(Menu onCreate, MenuInflater inflater) {
if (getActivity() instanceof SearchActivity) {
((SearchActivity) getActivity()).getClearToolbar(false);
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (!isSelectFavoriteMode()) {
FavouritePoint point = favouritesAdapter.getItem(position);
showOnMap(point, getActivity());
} else {
Intent intent = getActivity().getIntent();
intent.putExtra(SELECT_FAVORITE_POINT_INTENT_KEY, favouritesAdapter.getItem(position));
getActivity().setResult(SELECT_FAVORITE_POINT_RESULT_OK, intent);
getActivity().finish();
}
}
public static class FavouritesAdapter extends ArrayAdapter<FavouritePoint> {
private Activity activity;
private LatLon location;
private OsmandApplication app;
private boolean searchAroundLocation;
private int screenOrientation;
private Float heading;
private boolean shoudShowMenuButton;
public FavouritesAdapter(Activity activity, List<FavouritePoint> list,
boolean shoudShowMenuButton) {
super(activity, R.layout.favorites_list_item, list);
this.activity = activity;
this.app = ((OsmandApplication) activity.getApplication());
this.shoudShowMenuButton = shoudShowMenuButton;
}
public LatLon getLocation() {
return location;
}
public void updateLocation(LatLon l) {
location = l;
sort(new Comparator<FavouritePoint>() {
@Override
public int compare(FavouritePoint object1, FavouritePoint object2) {
if (location != null) {
double d1 = MapUtils.getDistance(location, object1.getLatitude(), object1.getLongitude());
double d2 = MapUtils.getDistance(location, object2.getLatitude(), object2.getLongitude());
if (d1 == d2) {
return 0;
} else if (d1 > d2) {
return 1;
}
return -1;
} else {
return getName(object1).compareTo(getName(object2));
}
}
});
}
public String getName(FavouritePoint model) {
return model.getName();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = activity.getLayoutInflater(); // favourite dank
row = inflater.inflate(R.layout.favorites_list_item, parent, false);
}
TextView name = (TextView) row.findViewById(R.id.favourite_label);
TextView distanceText = (TextView) row.findViewById(R.id.distance);
ImageView icon = (ImageView) row.findViewById(R.id.favourite_icon);
ImageView direction = (ImageView) row.findViewById(R.id.direction);
ImageView giImage= (ImageView)row.findViewById(R.id.group_image);
direction.setVisibility(View.VISIBLE);
final FavouritePoint favorite = getItem(position);
if (shoudShowMenuButton) {
ImageButton options = (ImageButton) row.findViewById(R.id.options);
options.setFocusable(false);
options.setImageDrawable(((OsmandApplication) activity.getApplication())
.getIconsCache().getThemedIcon(R.drawable.ic_overflow_menu_white));
options.setVisibility(View.VISIBLE);
options.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showOnMap(favorite, activity);
}
});
}
if (!favorite.getCategory().isEmpty()) {
giImage.setVisibility(View.VISIBLE);
giImage.setImageDrawable(app.getIconsCache().getThemedIcon(R.drawable.ic_small_group));
} else {
giImage.setVisibility(View.GONE);
}
((TextView) row.findViewById(R.id.group_name)).setText(favorite.getCategory());
icon.setImageDrawable(FavoriteImageDrawable.getOrCreate(activity, favorite.getColor(), false));
DashLocationFragment.updateLocationView(!searchAroundLocation, location, heading, direction, distanceText,
favorite.getLatitude(), favorite.getLongitude(), screenOrientation, app, activity);
name.setText(getName(favorite));
final CheckBox ch = (CheckBox) row.findViewById(R.id.toggle_item);
icon.setVisibility(View.VISIBLE);
ch.setVisibility(View.GONE);
if (activity instanceof SearchActivity)
ViewCompat.setAccessibilityDelegate(row, ((SearchActivity)activity).getAccessibilityAssistant());
return row;
}
}
public OsmandApplication getMyApplication() {
return (OsmandApplication) getActivity().getApplication();
}
@Override
public void updateCompassValue(float value) {
// 99 in next line used to one-time initialize arrows (with reference vs. fixed-north direction) on non-compass
// devices
FragmentActivity activity = getActivity();
float lastHeading = favouritesAdapter.heading != null ? favouritesAdapter.heading : 99;
favouritesAdapter.heading = value;
if (Math.abs(MapUtils.degreesDiff(lastHeading, favouritesAdapter.heading)) > 5) {
if (activity instanceof SearchActivity) {
((SearchActivity)activity).getAccessibilityAssistant().lockEvents();
favouritesAdapter.notifyDataSetChanged();
((SearchActivity)activity).getAccessibilityAssistant().unlockEvents();
} else {
favouritesAdapter.notifyDataSetChanged();
}
} else {
favouritesAdapter.heading = lastHeading;
}
if (activity instanceof SearchActivity) {
final View selected = ((SearchActivity)activity).getAccessibilityAssistant().getFocusedView();
if (selected != null) {
try {
int position = getListView().getPositionForView(selected);
if ((position != AdapterView.INVALID_POSITION) && (position >= getListView().getHeaderViewsCount())) {
FavouritePoint point = favouritesAdapter.getItem(position - getListView().getHeaderViewsCount());
LatLon location = new LatLon(point.getLatitude(), point.getLongitude());
((SearchActivity)activity).getNavigationInfo().updateTargetDirection(location, favouritesAdapter.heading.floatValue());
}
} catch (Exception e) {
return;
}
}
}
}
public static void showOnMap(FavouritePoint point, Activity activity) {
OsmandApplication app = (OsmandApplication) activity.getApplication();
final OsmandSettings settings = app.getSettings();
LatLon location = new LatLon(point.getLatitude(), point.getLongitude());
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
new PointDescription(PointDescription.POINT_TYPE_FAVORITE, point.getName()),
true,
point); //$NON-NLS-1$
MapActivity.launchMapActivityMoveToTop(activity);
}
}