Search favorites

This commit is contained in:
Victor Shcherb 2011-09-13 00:25:26 +02:00
parent 320d1d93de
commit 1f807756ee
12 changed files with 278 additions and 27 deletions

View file

@ -27,6 +27,7 @@
<activity android:name=".activities.NavigatePointActivity"></activity>
<activity android:name=".activities.DownloadIndexActivity" android:configChanges="keyboardHidden|orientation" android:label="@string/local_index_download"></activity>
<activity android:name=".activities.ShowRouteInfoActivity"></activity>
<activity android:name=".activities.FavouritesListActivity"></activity>
<activity android:name=".activities.FavouritesActivity" android:label="@string/favourites_activity"></activity>
<activity android:name=".activities.ContributionVersionActivity" android:label="@string/contribution_activity"></activity>

View file

@ -13,7 +13,7 @@
<TextView android:id="@+id/favouritedistance_label"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center"
android:textSize="23sp" android:maxWidth="150dp" android:minWidth="100dp"/>
android:textSize="23sp" android:maxWidth="150dp" android:minWidth="90dp"/>
<TextView android:id="@+id/favourite_label" android:layout_width="wrap_content" android:layout_marginLeft="10dp"
android:layout_height="wrap_content" android:textSize="23sp" />

View file

@ -13,7 +13,7 @@
<item android:id="@+id/map_get_directions" android:title="@string/get_directions" android:icon="@android:drawable/ic_menu_directions"></item>
<item android:id="@+id/map_save_directions" android:title="@string/menu_save_directions" android:icon="@android:drawable/ic_menu_save" visible="false"></item>
<item android:title="@string/map_specify_point" android:id="@+id/map_specify_point" android:icon="@android:drawable/ic_menu_search"></item>
<item android:title="@string/context_menu_item_search" android:id="@+id/map_specify_point" android:icon="@android:drawable/ic_menu_search"></item>
<item android:title="@string/show_gps_status" android:id="@+id/map_show_gps_status" android:icon="@android:drawable/ic_menu_compass"></item>
<item android:title="@string/map_route_by_gpx" android:id="@+id/map_gpx_routing"></item>

View file

@ -46,7 +46,7 @@
<string name="local_index_no_items_to_do">Нет объектов, чтобы %1$s</string>
<string name="local_index_action_do">Вы собириаетесь %1$s %2$s объектов. Вы уверены?</string>
<string name="local_index_descr_title">Менеджер офлайн данных:</string>
<string name="local_index_description">Офлайн данные доступные на SD карточке. Вы можете загрузить новые, архивировать и удалить данные.</string>
<string name="local_index_description">Офлайн данные доступные на SD карточке. Вы можете загрузить новые, архивировать и удалить данные. Доступно %1$s.</string>
<string name="local_index_mi_restore">Восстановить</string>
<string name="local_index_mi_backup">Архив</string>
<string name="local_index_mi_delete">Удалить</string>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<string name="local_index_description">Download new, or move to backup or delete existing data. \nCurrent offline data on device (%1$s is available):</string>
<string name="search_position_current_location_search">Search location...</string>
<string name="search_position_current_location_found">Location [Found]</string>
<string name="search_position_address">Address...</string>
@ -10,7 +11,7 @@
<string name="search_position_map_view">Last map view</string>
<string name="select_search_position">Search around :</string>
<string name="context_menu_item_search">Search around</string>
<string name="context_menu_item_search">Search</string>
<string name="tip_recent_changes_0_6_7_t">Recent changes for 0.6.7 :
\n\t- Offline data manager (download, delete, backup offline data directly in Osmand)
\n\t- Favorite points and groups (categorize, delete, manage favorites)
@ -57,7 +58,7 @@
<string name="local_index_no_items_to_do">No items to %1$s</string>
<string name="local_index_action_do">You are about to %1$s %2$s item(s). Continue?</string>
<string name="local_index_descr_title">Offline Data Manager:</string>
<string name="local_index_description">Download new, or move to backup or delete existing data.\nCurrent offline data on device:</string>
<string name="local_index_mi_restore">Restore...</string>
<string name="local_index_mi_backup">Backup...</string>
<string name="local_index_mi_delete">Delete...</string>

View file

@ -1,6 +1,9 @@
package net.osmand;
public class FavouritePoint {
import java.io.Serializable;
public class FavouritePoint implements Serializable {
private static final long serialVersionUID = 729654300829771466L;
private String name;
private String category = "";
private double latitude;

View file

@ -0,0 +1,203 @@
/**
*
*/
package net.osmand.plus.activities;
import java.util.Comparator;
import java.util.List;
import net.osmand.FavouritePoint;
import net.osmand.OsmAndFormatter;
import net.osmand.osm.LatLon;
import net.osmand.osm.MapUtils;
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 android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
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;
import android.widget.ListView;
import android.widget.TextView;
/**
*
*/
public class FavouritesListActivity extends ListActivity implements SearchActivityChild {
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 LatLon location;
private boolean selectFavoriteMode;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
ListView lv = new ListView(this);
lv.setId(android.R.id.list);
setContentView(lv);
favouritesAdapter = new FavouritesAdapter(((OsmandApplication) getApplication()).getFavorites().getFavouritePoints());
setListAdapter(favouritesAdapter);
}
@Override
protected void onResume() {
super.onResume();
Intent intent = getIntent();
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) {
location = new LatLon(lat, lon);
}
}
}
if (!isSelectFavoriteMode()) {
if (location == null && getParent() instanceof SearchActivity) {
location = ((SearchActivity) getParent()).getSearchPoint();
}
if (location == null) {
location = OsmandSettings.getOsmandSettings(this).getLastKnownMapLocation();
}
}
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);
}
});
}
}
@Override
public void locationUpdate(LatLon l) {
location = l;
favouritesAdapter.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 favouritesAdapter.getName(object1).compareTo(favouritesAdapter.getName(object2));
}
}
});
}
public boolean isSelectFavoriteMode(){
return selectFavoriteMode;
}
private boolean onItemLongClick(int pos) {
final FavouritePoint entry = favouritesAdapter.getItem(pos);
AlertDialog.Builder builder = new AlertDialog.Builder(FavouritesListActivity.this);
builder.setTitle(entry.getName());
OnClickListener onClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
OsmandSettings.getOsmandSettings(FavouritesListActivity.this).setMapLocationToShow(entry.getLatitude(),
entry.getLongitude());
} else if (which == 1) {
OsmandSettings.getOsmandSettings(FavouritesListActivity.this).setPointToNavigate(entry.getLatitude(),
entry.getLongitude(), getString(R.string.favorite) + " : " + entry.getName());
}
MapActivity.launchMapActivityMoveToTop(FavouritesListActivity.this);
}
};
builder.setItems(new String[] { getString(R.string.show_poi_on_map), getString(R.string.navigate_to) }, onClickListener);
builder.show();
return true;
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
if(!isSelectFavoriteMode()) {
FavouritePoint point = favouritesAdapter.getItem(position);
OsmandSettings.getOsmandSettings(this).SHOW_FAVORITES.set( true);
OsmandSettings.getOsmandSettings(this).setMapLocationToShow(point.getLatitude(), point.getLongitude(), getString(R.string.favorite)+" : " + point.getName()); //$NON-NLS-1$
MapActivity.launchMapActivityMoveToTop(FavouritesListActivity.this);
} else {
Intent intent = getIntent();
intent.putExtra(SELECT_FAVORITE_POINT_INTENT_KEY, favouritesAdapter.getItem(position));
setResult(SELECT_FAVORITE_POINT_RESULT_OK, intent);
finish();
}
}
class FavouritesAdapter extends ArrayAdapter<FavouritePoint> {
public FavouritesAdapter(List<FavouritePoint> list) {
super(FavouritesListActivity.this, R.layout.favourites_list_item, list);
}
public String getName(FavouritePoint model){
return model.getCategory() + " : " + model.getName();
}
@Override
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);
final FavouritePoint model = getItem(position);
if (model.isStored()) {
icon.setImageResource(R.drawable.favorites);
} else {
icon.setImageResource(R.drawable.opened_poi);
}
if (location != null) {
int dist = (int) (MapUtils.getDistance(model.getLatitude(), model.getLongitude(), location.getLatitude(), location
.getLongitude()));
distanceLabel.setText(OsmAndFormatter.getFormattedDistance(dist, FavouritesListActivity.this));
distanceLabel.setVisibility(View.VISIBLE);
} else {
distanceLabel.setVisibility(View.GONE);
}
label.setText(getName(model));
final CheckBox ch = (CheckBox) row.findViewById(R.id.check_item);
row.findViewById(R.id.favourite_icon).setVisibility(View.VISIBLE);
ch.setVisibility(View.GONE);
return row;
}
}
}

View file

@ -30,6 +30,7 @@ import android.graphics.Color;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StatFs;
import android.os.AsyncTask.Status;
import android.view.ContextMenu;
import android.view.LayoutInflater;
@ -62,7 +63,10 @@ public class LocalIndexesActivity extends ExpandableListActivity {
protected static int DELETE_OPERATION = 1;
protected static int BACKUP_OPERATION = 2;
protected static int RESTORE_OPERATION = 3;
MessageFormat formatMb = new MessageFormat("{0, number,##.#} MB", Locale.US);
MessageFormat formatGb = new MessageFormat("{0, number,#.##} GB", Locale.US);
@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -110,6 +114,7 @@ public class LocalIndexesActivity extends ExpandableListActivity {
});
setListAdapter(listAdapter);
updateDescriptionTextWithSize();
}
public class LoadLocalIndexTask extends AsyncTask<Activity, LocalIndexInfo, List<LocalIndexInfo>> {
@ -515,6 +520,17 @@ public class LocalIndexesActivity extends ExpandableListActivity {
listAdapter.notifyDataSetChanged();
}
private void updateDescriptionTextWithSize(){
File dir = OsmandSettings.getOsmandSettings(this).extendOsmandPath("");
String size = formatGb.format(new Object[]{0});
if(dir.canRead()){
StatFs fs = new StatFs(dir.getAbsolutePath());
size = formatGb.format(new Object[]{(float) (fs.getAvailableBlocks()) * fs.getBlockSize() / (1 << 30) });
}
((TextView) findViewById(R.id.DescriptionText)).setText(
getString(R.string.local_index_description, size));
}
private void closeSelectionMode(){
selectionMode = false;
findViewById(R.id.DownloadButton).setVisibility(View.VISIBLE);
@ -524,7 +540,10 @@ public class LocalIndexesActivity extends ExpandableListActivity {
findViewById(R.id.CancelButton).setVisibility(View.GONE);
findViewById(R.id.ActionButton).setVisibility(View.GONE);
((TextView) findViewById(R.id.DescriptionTextTop)).setVisibility(View.GONE);
((TextView) findViewById(R.id.DescriptionText)).setText(R.string.local_index_description);
;
updateDescriptionTextWithSize();
listAdapter.cancelFilter();
collapseAllGroups();
listAdapter.notifyDataSetChanged();
@ -596,10 +615,8 @@ public class LocalIndexesActivity extends ExpandableListActivity {
List<LocalIndexInfo> category = new ArrayList<LocalIndexInfo>();
List<LocalIndexInfo> filterCategory = null;
private MessageFormat formatMb;
public LocalIndexesAdapter() {
formatMb = new MessageFormat("{0, number,##.#} MB", Locale.US);
}
public void clear() {

View file

@ -21,7 +21,6 @@ import net.osmand.plus.R;
import net.osmand.plus.ResourceManager;
import net.osmand.plus.activities.RouteProvider.GPXRouteParams;
import net.osmand.plus.activities.search.SearchActivity;
import net.osmand.plus.activities.search.SearchPoiFilterActivity;
import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.MapTileLayer;
import net.osmand.plus.views.OsmandMapTileView;

View file

@ -1,13 +1,16 @@
package net.osmand.plus.activities.search;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
import net.osmand.FavouritePoint;
import net.osmand.osm.LatLon;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.FavouritesListActivity;
import net.osmand.plus.activities.NavigatePointActivity;
import android.app.Activity;
import android.app.TabActivity;
@ -36,13 +39,15 @@ public class SearchActivity extends TabActivity {
protected static final int POSITION_CURRENT_LOCATION = 1;
protected static final int POSITION_LAST_MAP_VIEW = 2;
protected static final int POSITION_ADDRESS = 3;
protected static final int POSITION_FAVORITES = 4;
protected static final int POSITION_FAVORITES = 3;
protected static final int POSITION_ADDRESS = 4;
private static final int GPS_TIMEOUT_REQUEST = 1000;
private static final int GPS_DIST_REQUEST = 5;
private static final int GPS_ACCURACY = 50;
private static final int REQUEST_FAVORITE_SELECT = 1;
public static final String SEARCH_LAT = "net.osmand.search_lat"; //$NON-NLS-1$
public static final String SEARCH_LON = "net.osmand.search_lon"; //$NON-NLS-1$
@ -76,7 +81,8 @@ public class SearchActivity extends TabActivity {
getString(R.string.search_position_current_location),
getString(R.string.search_position_map_view),
getString(R.string.search_position_favorites),
getString(R.string.search_position_address)
// Address is not yet implemented
// getString(R.string.search_position_address)
}))
);
@ -90,9 +96,8 @@ public class SearchActivity extends TabActivity {
host.addTab(addressSpec);
host.addTab(host.newTabSpec("Search_Location").setIndicator(getString(R.string.search_tabs_location)).setContent(createIntent(NavigatePointActivity.class))); //$NON-NLS-1$
TabSpec transportTab = host.newTabSpec("Search_Transport").setIndicator(getString(R.string.transport)).setContent(createIntent(SearchTransportActivity.class));
//if (searchPoint != null) {
host.addTab(transportTab); //$NON-NLS-1$
//}
host.addTab(transportTab); //$NON-NLS-1$
host.addTab(host.newTabSpec("Search_Favorites").setIndicator(getString(R.string.favorite)).setContent(createIntent(FavouritesListActivity.class))); //$NON-NLS-1$
host.addTab(host.newTabSpec("Search_History").setIndicator(getString(R.string.history)).setContent(createIntent(SearchHistoryActivity.class))); //$NON-NLS-1$
host.setCurrentTab(POI_TAB_INDEX);
@ -112,6 +117,11 @@ public class SearchActivity extends TabActivity {
if (position == POSITION_LAST_MAP_VIEW) {
OsmandSettings settings = OsmandSettings.getOsmandSettings(SearchActivity.this);
updateSearchPoint(settings.getLastKnownMapLocation(), getString(R.string.search_position_fixed), true);
} else if (position == POSITION_FAVORITES) {
Intent intent = new Intent(SearchActivity.this, FavouritesListActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.putExtra(FavouritesListActivity.SELECT_FAVORITE_POINT_INTENT_KEY, (Serializable) null);
startActivityForResult(intent, REQUEST_FAVORITE_SELECT);
}
}
}
@ -123,6 +133,18 @@ public class SearchActivity extends TabActivity {
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_FAVORITE_SELECT && resultCode == FavouritesListActivity.SELECT_FAVORITE_POINT_RESULT_OK){
FavouritePoint p = (FavouritePoint) data.getSerializableExtra(FavouritesListActivity.SELECT_FAVORITE_POINT_INTENT_KEY);
if (p != null) {
LatLon latLon = new LatLon(p.getLatitude(), p.getLongitude());
updateSearchPoint(latLon, p.getName(), false);
}
}
}
public void startSearchCurrentLocation(){
@ -177,10 +199,13 @@ public class SearchActivity extends TabActivity {
double lat = intent.getDoubleExtra(SEARCH_LAT, 0);
double lon = intent.getDoubleExtra(SEARCH_LON, 0);
if (lat != 0 || lon != 0) {
LatLon searchPoint = new LatLon(lat, lon);
updateSearchPoint(searchPoint, getString(R.string.search_position_fixed), true);
updateSearchPoint(new LatLon(lat, lon), getString(R.string.search_position_fixed), true);
}
}
if(searchPoint == null){
LatLon last = OsmandSettings.getOsmandSettings(this).getLastKnownMapLocation();
updateSearchPoint(last, getString(R.string.search_position_fixed), true);
}
}
@Override
@ -189,12 +214,16 @@ public class SearchActivity extends TabActivity {
endSearchCurrentLocation();
}
private String formatLatLon(LatLon searchPoint){
MessageFormat format = new MessageFormat(" ({0,number,#.##};{1,number,#.##})", Locale.US);
return format.format(new Object[]{searchPoint.getLatitude(), searchPoint.getLongitude()});
}
public void updateSearchPoint(LatLon searchPoint, String message, boolean showLoc){
spinnerAdapter.remove(spinnerAdapter.getItem(0));
String suffix = "";
if(showLoc && searchPoint != null){
MessageFormat format = new MessageFormat(" ({0,number,#.##};{1,number,#.##})", Locale.US);
suffix = format.format(new Object[]{searchPoint.getLatitude(), searchPoint.getLongitude()});
suffix = formatLatLon(searchPoint);
}
spinnerAdapter.insert(message + suffix, 0);
this.searchPoint = searchPoint;

View file

@ -104,13 +104,13 @@ public class SearchHistoryActivity extends ListActivity implements SearchActivit
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == 0) {
OsmandSettings.getOsmandSettings(SearchHistoryActivity.this).setMapLocationToShow(entry.getLat(), entry.getLon());
OsmandSettings.getOsmandSettings(SearchHistoryActivity.this).setMapLocationToShow(entry.getLat(),
entry.getLon());
} else if (which == 1) {
OsmandSettings.getOsmandSettings(SearchHistoryActivity.this).setPointToNavigate(entry.getLat(), entry.getLon(), null);
OsmandSettings.getOsmandSettings(SearchHistoryActivity.this).setPointToNavigate(entry.getLat(), entry.getLon(),
null);
}
MapActivity.launchMapActivityMoveToTop(SearchHistoryActivity.this);
}
});

View file

@ -48,8 +48,6 @@ import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;