/** * */ package net.osmand.plus.activities; import java.io.File; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import net.osmand.FavouritePoint; import net.osmand.GPXUtilities; import net.osmand.OsmAndFormatter; import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXFileResult; import net.osmand.GPXUtilities.WptPt; import net.osmand.osm.LatLon; import net.osmand.osm.MapUtils; import net.osmand.plus.FavouritesDbHelper; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.ResourceManager; import android.app.AlertDialog; import android.app.ListActivity; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ContextMenu.ContextMenuInfo; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.AdapterContextMenuInfo; /** * */ public class FavouritesActivity extends ListActivity { public static final int NAVIGATE_TO = 0; public static final int DELETE_ITEM = 1; public static final int EDIT_ITEM = 2; public static final int EXPORT_ID = 0; public static final int IMPORT_ID = 1; public static final String FILE_TO_SAVE = "favourites.gpx"; //$NON-NLS-1$ private FavouritesAdapter favouritesAdapter; private FavouritesDbHelper helper; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); ListView lv = new ListView(this); lv.setId(android.R.id.list); setContentView(lv); /* Add Context-Menu listener to the ListView. */ lv.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener(){ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.setHeaderTitle(R.string.favourites_context_menu_title); menu.add(0, NAVIGATE_TO, 0, R.string.favourites_context_menu_navigate); final FavouritePoint point = (FavouritePoint) favouritesAdapter.getItem(((AdapterContextMenuInfo)menuInfo).position); if(point.isStored()){ menu.add(0, EDIT_ITEM, 1, R.string.favourites_context_menu_edit); menu.add(0, DELETE_ITEM, 2, R.string.favourites_context_menu_delete); } } }); } @Override protected void onResume() { super.onResume(); helper = ((OsmandApplication)getApplication()).getFavorites(); ArrayList<FavouritePoint> list = new ArrayList<FavouritePoint>(helper.getFavouritePoints()); if(helper.getFavoritePointsFromGPXFile() != null){ list.addAll(helper.getFavoritePointsFromGPXFile()); } favouritesAdapter = new FavouritesAdapter(list); final LatLon mapLocation = OsmandSettings.getLastKnownMapLocation(OsmandSettings.getPrefs(this)); if(mapLocation != null){ favouritesAdapter.sort(new Comparator<FavouritePoint>(){ @Override public int compare(FavouritePoint object1, FavouritePoint object2) { double d1 = MapUtils.getDistance(mapLocation, object1.getLatitude(), object1.getLongitude()); double d2 = MapUtils.getDistance(mapLocation, object2.getLatitude(), object2.getLongitude()); if(d1 == d2){ return 0; } else if(d1 > d2){ return 1; } return -1; } }); } getListView().setAdapter(favouritesAdapter); } public void onListItemClick(ListView parent, View v, int position, long id) { FavouritePoint point = favouritesAdapter.getItem(position); OsmandSettings.setShowingFavorites(this, true); OsmandSettings.setMapLocationToShow(this, point.getLatitude(), point.getLongitude(), getString(R.string.favorite)+" : " + point.getName()); //$NON-NLS-1$ Intent newIntent = new Intent(FavouritesActivity.this, MapActivity.class); startActivity(newIntent); } @Override public boolean onContextItemSelected(MenuItem aItem) { AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo(); final FavouritePoint point = (FavouritePoint) favouritesAdapter.getItem(menuInfo.position); if (aItem.getItemId() == NAVIGATE_TO) { //OsmandSettings.setMapLocationToShow(this, point.getLatitude(), point.getLongitude(), getString(R.string.favorite)+" : " + point.getName()); //$NON-NLS-1$ OsmandSettings.setPointToNavigate(this, point.getLatitude(), point.getLongitude()); Intent newIntent = new Intent(FavouritesActivity.this, MapActivity.class); startActivity(newIntent); } else if (aItem.getItemId() == EDIT_ITEM) { Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.favourites_edit_dialog_title); final EditText editText = new EditText(this); builder.setView(editText); editText.setText(point.getName()); builder.setNegativeButton(R.string.default_buttons_cancel, null); builder.setPositiveButton(R.string.default_buttons_apply, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { boolean editied = helper.editFavouriteName(point, editText.getText().toString()); if (editied) { favouritesAdapter.notifyDataSetChanged(); } } }); builder.create().show(); return true; } if (aItem.getItemId() == DELETE_ITEM) { final Resources resources = this.getResources(); Builder builder = new AlertDialog.Builder(this); builder.setMessage(R.string.favourites_remove_dialog_title); builder.setNegativeButton(R.string.default_buttons_no, null); builder.setPositiveButton(R.string.default_buttons_yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { boolean deleted = helper.deleteFavourite(point); if (deleted) { Toast.makeText(FavouritesActivity.this, MessageFormat.format(resources.getString(R.string.favourites_remove_dialog_success), point.getName()), Toast.LENGTH_SHORT).show(); favouritesAdapter.remove(point); } } }); builder.create().show(); return true; } return false; } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuItem item = menu.add(0, EXPORT_ID, 0, R.string.export_fav); item.setIcon(android.R.drawable.ic_menu_save); item = menu.add(0, IMPORT_ID, 0, R.string.import_fav); item.setIcon(android.R.drawable.ic_menu_upload); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == EXPORT_ID){ File appDir = OsmandSettings.extendOsmandPath(getApplicationContext(), ResourceManager.APP_DIR); if(favouritesAdapter.isEmpty()){ Toast.makeText(this, R.string.no_fav_to_save, Toast.LENGTH_LONG).show(); } else if(!appDir.exists()){ Toast.makeText(this, R.string.sd_dir_not_accessible, Toast.LENGTH_LONG).show(); } else { File f = new File(appDir, FILE_TO_SAVE); GPXFile gpx = new GPXFile(); for (int i = 0; i < favouritesAdapter.getCount(); i++) { FavouritePoint p = favouritesAdapter.getItem(i); WptPt pt = new WptPt(); pt.lat = p.getLatitude(); pt.lon = p.getLongitude(); pt.name = p.getName(); gpx.points.add(pt); } String warning = GPXUtilities.writeGpxFile(f, gpx, this); if(warning == null){ Toast.makeText(this, MessageFormat.format(getString(R.string.fav_saved_sucessfully), f.getAbsolutePath()), Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, warning, Toast.LENGTH_LONG).show(); } } } else if(item.getItemId() == IMPORT_ID){ File appDir = OsmandSettings.extendOsmandPath(getApplicationContext(), ResourceManager.APP_DIR); File f = new File(appDir, FILE_TO_SAVE); if(!f.exists()){ Toast.makeText(this, MessageFormat.format(getString(R.string.fav_file_to_load_not_found), f.getAbsolutePath()), Toast.LENGTH_LONG).show(); } else { Set<String> existedPoints = new LinkedHashSet<String>(); if(!favouritesAdapter.isEmpty()){ for (int i = 0; i < favouritesAdapter.getCount(); i++) { FavouritePoint fp = favouritesAdapter.getItem(i); existedPoints.add(fp.getName()); } } GPXFileResult res = GPXUtilities.loadGPXFile(this, f); if (res.error == null) { for(WptPt p : res.wayPoints){ if(!existedPoints.contains(p.name)){ FavouritePoint fp = new FavouritePoint(p.lat, p.lon, p.name); if(helper.addFavourite(fp)){ favouritesAdapter.add(fp); } } } Toast.makeText(this, R.string.fav_imported_sucessfully, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, res.error, Toast.LENGTH_LONG).show(); } } } else { return false; } return true; } class FavouritesAdapter extends ArrayAdapter<FavouritePoint> { FavouritesAdapter(List<FavouritePoint> list) { super(FavouritesActivity.this, R.layout.favourites_list_item, list); } public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; if (row == null) { LayoutInflater inflater = getLayoutInflater(); row = inflater.inflate(R.layout.favourites_list_item, parent, false); } TextView label = (TextView) row.findViewById(R.id.favourite_label); TextView distanceLabel = (TextView) row.findViewById(R.id.favouritedistance_label); ImageView icon = (ImageView) row.findViewById(R.id.favourite_icon); FavouritePoint model = (FavouritePoint) getItem(position); row.setTag(model); if(model.isStored()){ icon.setImageResource(R.drawable.favorites); } else { icon.setImageResource(R.drawable.opened_poi); } LatLon lastKnownMapLocation = OsmandSettings.getLastKnownMapLocation(OsmandSettings.getPrefs(FavouritesActivity.this)); int dist = (int) (MapUtils.getDistance(model.getLatitude(), model.getLongitude(), lastKnownMapLocation.getLatitude(), lastKnownMapLocation.getLongitude())); distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist, FavouritesActivity.this)); label.setText(model.getName()); return row; } } }