Quick action for directions to

This commit is contained in:
Victor Shcherb 2012-08-23 00:11:13 +02:00
parent c5c3f3dbc6
commit c8cbe800a3
8 changed files with 285 additions and 96 deletions

View file

@ -117,6 +117,15 @@ public class QuickAction extends CustomPopupWindow {
actionList.add(action);
}
/**
* Add action item
*
* @param action {@link ActionItem}
*/
public void addActionItem(ActionItem action, int pos) {
actionList.add(pos, action);
}
/**
* Show popup window
*/

View file

@ -966,6 +966,7 @@ public class OsmandSettings {
public final static String POINT_NAVIGATE_LAT = "point_navigate_lat"; //$NON-NLS-1$
public final static String POINT_NAVIGATE_LON = "point_navigate_lon"; //$NON-NLS-1$
public final static String POINT_NAVIGATE_ROUTE = "point_navigate_route"; //$NON-NLS-1$
public LatLon getPointToNavigate() {
float lat = globalPreferences.getFloat(POINT_NAVIGATE_LAT, 0);
@ -975,13 +976,27 @@ public class OsmandSettings {
}
return new LatLon(lat, lon);
}
public boolean isRouteToPointNavigateAndClear(){
boolean t = globalPreferences.contains(POINT_NAVIGATE_ROUTE);
globalPreferences.edit().remove(POINT_NAVIGATE_ROUTE).commit();
return t;
}
public boolean clearPointToNavigate() {
return globalPreferences.edit().remove(POINT_NAVIGATE_LAT).remove(POINT_NAVIGATE_LON).commit();
return globalPreferences.edit().remove(POINT_NAVIGATE_LAT).remove(POINT_NAVIGATE_LON).
remove(POINT_NAVIGATE_ROUTE).commit();
}
public boolean setPointToNavigate(double latitude, double longitude, String historyDescription) {
return setPointToNavigate(latitude, longitude, false, historyDescription);
}
public boolean setPointToNavigate(double latitude, double longitude, String historyDescription) {
public boolean setPointToNavigate(double latitude, double longitude, boolean navigate, String historyDescription) {
boolean add = globalPreferences.edit().putFloat(POINT_NAVIGATE_LAT, (float) latitude).putFloat(POINT_NAVIGATE_LON, (float) longitude).commit();
if(navigate) {
globalPreferences.edit().putString(POINT_NAVIGATE_ROUTE, "true").commit();
}
if(add){
if(historyDescription != null){
SearchHistoryHelper.getInstance().addNewItemToHistory(latitude, longitude, historyDescription, ctx);

View file

@ -16,6 +16,8 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import net.londatiga.android.ActionItem;
import net.londatiga.android.QuickAction;
import net.osmand.FavouritePoint;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
@ -36,6 +38,7 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@ -227,12 +230,42 @@ public class FavouritesActivity extends OsmandExpandableListActivity {
favoritesToDelete.remove(model);
}
} else {
FavouritePoint point = (FavouritePoint) favouritesAdapter.getChild(groupPosition, childPosition);
OsmandSettings settings = getMyApplication().getSettings();
settings.SHOW_FAVORITES.set(true);
settings.setMapLocationToShow(point.getLatitude(), point.getLongitude(),
Math.max(12, settings.getLastKnownMapZoom()), null, getString(R.string.favorite)+":\n " + point.getName(), point);
MapActivity.launchMapActivityMoveToTop(FavouritesActivity.this);
QuickAction qa = new QuickAction(v);
final OsmandSettings settings = getMyApplication().getSettings();
final FavouritePoint point = (FavouritePoint) favouritesAdapter.getChild(groupPosition, childPosition);
String name = getString(R.string.favorite) + ": " + point.getName();
LatLon location = new LatLon(point.getLatitude(), point.getLongitude());
OnClickListener onshow = new OnClickListener() {
@Override
public void onClick(View v) {
settings.SHOW_FAVORITES.set(true);
}
};
MapActivityActions.createDirectionsActions(qa, location, point, name, settings.getLastKnownMapZoom(), this,
true, onshow);
if (point.isStored()) {
ActionItem edit = new ActionItem();
edit.setTitle(getString(R.string.favourites_context_menu_edit));
edit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
editPoint(point);
}
});
qa.addActionItem(edit);
ActionItem delete = new ActionItem();
delete.setTitle(getString(R.string.favourites_context_menu_delete));
delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
deletePoint(point);
}
});
qa.addActionItem(delete);
}
qa.show();
}
return true;
}
@ -253,56 +286,64 @@ public class FavouritesActivity extends OsmandExpandableListActivity {
getMyApplication().getSettings().setPointToNavigate(point.getLatitude(), point.getLongitude(), getString(R.string.favorite)+" : " + point.getName());
MapActivity.launchMapActivityMoveToTop(this);
} else if (aItem.getItemId() == EDIT_ITEM) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.favourites_context_menu_edit);
final View v = getLayoutInflater().inflate(R.layout.favourite_edit_dialog, getExpandableListView(), false);
final AutoCompleteTextView cat = (AutoCompleteTextView) v.findViewById(R.id.Category);
final EditText editText = (EditText) v.findViewById(R.id.Name);
builder.setView(v);
editText.setText(point.getName());
cat.setText(point.getCategory());
cat.setThreshold(1);
cat.setAdapter(new ArrayAdapter<String>(this, R.layout.list_textview, helper.getFavoriteGroups().keySet().toArray(new String[] {})));
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(), cat.getText().toString());
if (editied) {
favouritesAdapter.synchronizeGroups();
favouritesAdapter.sort(favoritesComparator);
}
}
});
builder.create().show();
editText.requestFocus();
return true;
return editPoint(point);
}
if (aItem.getItemId() == DELETE_ITEM) {
final Resources resources = this.getResources();
Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.favourites_remove_dialog_msg, point.getName()));
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) {
AccessibleToast.makeText(FavouritesActivity.this,
MessageFormat.format(resources.getString(R.string.favourites_remove_dialog_success), point.getName()),
Toast.LENGTH_SHORT).show();
favouritesAdapter.synchronizeGroups();
favouritesAdapter.sort(favoritesComparator);
}
}
});
builder.create().show();
return true;
return deletePoint(point);
}
return false;
}
private boolean editPoint(final FavouritePoint point) {
Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.favourites_context_menu_edit);
final View v = getLayoutInflater().inflate(R.layout.favourite_edit_dialog, getExpandableListView(), false);
final AutoCompleteTextView cat = (AutoCompleteTextView) v.findViewById(R.id.Category);
final EditText editText = (EditText) v.findViewById(R.id.Name);
builder.setView(v);
editText.setText(point.getName());
cat.setText(point.getCategory());
cat.setThreshold(1);
cat.setAdapter(new ArrayAdapter<String>(this, R.layout.list_textview, helper.getFavoriteGroups().keySet().toArray(new String[] {})));
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(), cat.getText().toString());
if (editied) {
favouritesAdapter.synchronizeGroups();
favouritesAdapter.sort(favoritesComparator);
}
}
});
builder.create().show();
editText.requestFocus();
return true;
}
private boolean deletePoint(final FavouritePoint point) {
final Resources resources = this.getResources();
Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.favourites_remove_dialog_msg, point.getName()));
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) {
AccessibleToast.makeText(FavouritesActivity.this,
MessageFormat.format(resources.getString(R.string.favourites_remove_dialog_success), point.getName()),
Toast.LENGTH_SHORT).show();
favouritesAdapter.synchronizeGroups();
favouritesAdapter.sort(favoritesComparator);
}
}
});
builder.create().show();
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {

View file

@ -6,6 +6,7 @@ package net.osmand.plus.activities;
import java.util.Comparator;
import java.util.List;
import net.londatiga.android.QuickAction;
import net.osmand.FavouritePoint;
import net.osmand.OsmAndFormatter;
import net.osmand.osm.LatLon;
@ -24,7 +25,6 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
@ -85,12 +85,13 @@ public class FavouritesListActivity extends ListActivity implements SearchActivi
locationUpdate(location);
if (!isSelectFavoriteMode()) {
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
return FavouritesListActivity.this.onItemLongClick(position);
}
});
// TODO remove if not needed
// getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
// @Override
// public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
// return FavouritesListActivity.this.onItemLongClick(position);
// }
// });
}
}
@ -147,11 +148,20 @@ public class FavouritesListActivity extends ListActivity implements SearchActivi
protected void onListItemClick(ListView l, View v, int position, long id) {
if (!isSelectFavoriteMode()) {
QuickAction qa = new QuickAction(v);
FavouritePoint point = favouritesAdapter.getItem(position);
settings.SHOW_FAVORITES.set(true);
settings.setMapLocationToShow(point.getLatitude(), point.getLongitude(), settings.getLastKnownMapZoom(), null,
getString(R.string.favorite) + ": \n " + point.getName(), point); //$NON-NLS-1$
MapActivity.launchMapActivityMoveToTop(FavouritesListActivity.this);
String name = getString(R.string.favorite) + ": " + point.getName();
LatLon location = new LatLon(point.getLatitude(), point.getLongitude());
View.OnClickListener onshow = new View.OnClickListener() {
@Override
public void onClick(View v) {
settings.SHOW_FAVORITES.set(true);
}
};
MapActivityActions.createDirectionsActions(qa, location, point, name, settings.getLastKnownMapZoom(), this,
true, onshow);
qa.show();
} else {
Intent intent = getIntent();
intent.putExtra(SELECT_FAVORITE_POINT_INTENT_KEY, favouritesAdapter.getItem(position));

View file

@ -297,6 +297,10 @@ public class MapActivity extends AccessibleActivity implements IMapLocationListe
LatLon latLonToShow = settings.getAndClearMapLocationToShow();
String mapLabelToShow = settings.getAndClearMapLabelToShow();
Object toShow = settings.getAndClearObjectToShow();
if(settings.isRouteToPointNavigateAndClear()){
// always enable and follow and let calculate it (GPS is not accessible in garage)
mapActions.getDirections(getLastKnownLocation(), true);
}
if(mapLabelToShow != null && latLonToShow != null){
mapLayers.getContextMenuLayer().setSelectedObject(toShow);
mapLayers.getContextMenuLayer().setLocation(latLonToShow, mapLabelToShow);

View file

@ -9,6 +9,8 @@ import java.util.Date;
import java.util.Iterator;
import java.util.List;
import net.londatiga.android.ActionItem;
import net.londatiga.android.QuickAction;
import net.osmand.AndroidUtils;
import net.osmand.CallbackWithObject;
import net.osmand.FavouritePoint;
@ -66,6 +68,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
@ -394,7 +397,7 @@ public class MapActivityActions implements DialogProvider {
}
protected void getDirections(final Location from, boolean followEnabled) {
public void getDirections(final Location from, boolean followEnabled) {
final RoutingHelper routingHelper = mapActivity.getRoutingHelper();
@ -1066,4 +1069,53 @@ public class MapActivityActions implements DialogProvider {
});
menu.show();
}
public static void createDirectionsActions(QuickAction qa , final LatLon location, final Object obj, final String name, final int z, final Activity activity,
final boolean saveHistory, final OnClickListener onShow){
ActionItem showOnMap = new ActionItem();
final OsmandApplication app = ((OsmandApplication) activity.getApplication());
showOnMap.setIcon(activity.getResources().getDrawable(android.R.drawable.ic_dialog_map));
showOnMap.setTitle(activity.getString(R.string.show_poi_on_map));
showOnMap.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(onShow != null) {
onShow.onClick(v);
}
app.getSettings().setMapLocationToShow( location.getLatitude(), location.getLongitude(),
z, saveHistory ? name : null, name, obj); //$NON-NLS-1$
MapActivity.launchMapActivityMoveToTop(activity);
}
});
qa.addActionItem(showOnMap);
ActionItem setAsDestination = new ActionItem();
setAsDestination.setIcon(activity.getResources().getDrawable(R.drawable.list_view_set_destination));
setAsDestination.setTitle(activity.getString(R.string.navigate_to));
setAsDestination.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(onShow != null) {
onShow.onClick(v);
}
app.getSettings().setPointToNavigate(location.getLatitude(), location.getLongitude(), name);
MapActivity.launchMapActivityMoveToTop(activity);
}
});
qa.addActionItem(setAsDestination);
ActionItem directionsTo = new ActionItem();
directionsTo.setIcon(activity.getResources().getDrawable(R.drawable.list_view_directions_to_here));
directionsTo.setTitle(activity.getString(R.string.context_menu_item_directions));
directionsTo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(onShow != null) {
onShow.onClick(v);
}
app.getSettings().setPointToNavigate(location.getLatitude(), location.getLongitude(), true, name);
MapActivity.launchMapActivityMoveToTop(activity);
}
});
qa.addActionItem(directionsTo);
}
}

View file

@ -2,6 +2,8 @@ package net.osmand.plus.activities.search;
import java.util.List;
import net.londatiga.android.QuickAction;
import net.osmand.FavouritePoint;
import net.osmand.OsmAndFormatter;
import net.osmand.osm.LatLon;
import net.osmand.osm.MapUtils;
@ -9,6 +11,7 @@ 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.activities.MapActivityActions;
import net.osmand.plus.activities.search.SearchActivity.SearchActivityChild;
import net.osmand.plus.activities.search.SearchHistoryHelper.HistoryEntry;
import android.app.AlertDialog;
@ -18,6 +21,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
@ -123,14 +127,22 @@ public class SearchHistoryActivity extends ListActivity implements SearchActivi
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
HistoryEntry model = ((HistoryAdapter) getListAdapter()).getItem(position);
selectModel(model);
selectModel(model, v);
}
private void selectModel(HistoryEntry model) {
helper.selectEntry(model, this);
private void selectModel(final HistoryEntry model, View v) {
QuickAction qa = new QuickAction(v);
String name = model.getName();
OsmandSettings settings = ((OsmandApplication) getApplication()).getSettings();
settings.setMapLocationToShow(model.getLat(), model.getLon(), settings.getLastKnownMapZoom(), null, model.getName(), null);
MapActivity.launchMapActivityMoveToTop(this);
OnClickListener onShow = new View.OnClickListener() {
@Override
public void onClick(View v) {
helper.selectEntry(model, SearchHistoryActivity.this);
}
};
MapActivityActions.createDirectionsActions(qa, new LatLon(model.getLat(), model.getLon()),
model, name, settings.getLastKnownMapZoom(), this, false, onShow);
qa.show();
}
class HistoryAdapter extends ArrayAdapter<HistoryEntry> {
@ -168,18 +180,18 @@ public class SearchHistoryActivity extends ListActivity implements SearchActivi
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
selectModel(model);
selectModel(model, v);
}
};
View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return onItemLongClick(position);
}
};
distanceLabel.setOnLongClickListener(longClickListener);
label.setOnLongClickListener(longClickListener);
// View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
// @Override
// public boolean onLongClick(View v) {
// return onItemLongClick(position);
// }
// };
// distanceLabel.setOnLongClickListener(longClickListener);
// label.setOnLongClickListener(longClickListener);
distanceLabel.setOnClickListener(clickListener);
label.setOnClickListener(clickListener);
return row;

View file

@ -15,6 +15,8 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.londatiga.android.ActionItem;
import net.londatiga.android.QuickAction;
import net.osmand.Algoritms;
import net.osmand.LogUtil;
import net.osmand.OsmAndFormatter;
@ -26,7 +28,6 @@ import net.osmand.data.AmenityType;
import net.osmand.osm.LatLon;
import net.osmand.osm.OpeningHoursParser;
import net.osmand.osm.OpeningHoursParser.OpeningHours;
import net.osmand.osm.OpeningHoursParser.OpeningHoursRule;
import net.osmand.plus.NameFinderPoiFilter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
@ -36,8 +37,10 @@ import net.osmand.plus.SearchByNameFilter;
import net.osmand.plus.activities.CustomTitleBar;
import net.osmand.plus.activities.EditPOIFilterActivity;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.MapActivityActions;
import net.osmand.plus.activities.OsmandListActivity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@ -68,9 +71,9 @@ import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
@ -230,14 +233,15 @@ public class SearchPOIActivity extends OsmandListActivity implements SensorEvent
// ListActivity has a ListView, which you can get with:
ListView lv = getListView();
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
final Amenity amenity = ((AmenityAdapter) getListAdapter()).getItem(pos);
onLongClick(amenity);
return true;
}
});
// TODO remove if not needed
// lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
// @Override
// public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) {
// final Amenity amenity = ((AmenityAdapter) getListAdapter()).getItem(pos);
// onLongClick(amenity);
// return true;
// }
// });
}
private Path createDirectionPath() {
@ -559,16 +563,58 @@ public class SearchPOIActivity extends OsmandListActivity implements SensorEvent
currentLocationProvider = null;
}
}
@Override
public void onListItemClick(ListView parent, View v, int position, long id) {
int z = settings.getLastKnownMapZoom();
Amenity amenity = ((AmenityAdapter) getListAdapter()).getItem(position);
String poiSimpleFormat = OsmAndFormatter.getPoiSimpleFormat(amenity, this, settings.usingEnglishNames());
final Amenity amenity = ((AmenityAdapter) getListAdapter()).getItem(position);
QuickAction qa = new QuickAction(v);
String poiSimpleFormat = OsmAndFormatter.getPoiSimpleFormat(amenity, SearchPOIActivity.this, settings.usingEnglishNames());
String name = getString(R.string.poi)+" : " + poiSimpleFormat;
settings.setMapLocationToShow( amenity.getLocation().getLatitude(), amenity.getLocation().getLongitude(),
Math.max(16, z), name, name, amenity); //$NON-NLS-1$
MapActivity.launchMapActivityMoveToTop(SearchPOIActivity.this);
int z = Math.max(16, settings.getLastKnownMapZoom());
MapActivityActions.createDirectionsActions(qa, amenity.getLocation(), amenity, name, z, this, true , null);
ActionItem poiDescription = new ActionItem();
poiDescription.setTitle(getString(R.string.poi_context_menu_showdescription));
poiDescription.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Builder bs = new AlertDialog.Builder(v.getContext());
bs.setTitle(OsmAndFormatter.getPoiSimpleFormat(amenity, v.getContext(), settings.USE_ENGLISH_NAMES.get()));
StringBuilder d = new StringBuilder();
if(amenity.getOpeningHours() != null) {
d.append(getString(R.string.opening_hours) + " : ").append(amenity.getOpeningHours()).append("\n");
}
if(amenity.getPhone() != null) {
d.append(getString(R.string.phone) + " : ").append(amenity.getPhone()).append("\n");
}
if(amenity.getSite() != null) {
d.append(getString(R.string.website) + " : ").append(amenity.getSite()).append("\n");
}
if(amenity.getDescription() != null) {
d.append(amenity.getDescription());
}
bs.setMessage(d.toString());
bs.show();
}
});
qa.addActionItem(poiDescription, 2);
if (((OsmandApplication)getApplication()).accessibilityEnabled()) {
ActionItem showDetails = new ActionItem();
showDetails.setTitle(getString(R.string.show_details));
showDetails.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showPOIDetails(amenity, settings.usingEnglishNames());
}
});
qa.addActionItem(showDetails);
}
qa.show();
}