fix menu, fix context menu

git-svn-id: https://osmand.googlecode.com/svn/trunk@146 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-06-09 12:06:59 +00:00
parent 88b46f6489
commit 344c0b9b8e
9 changed files with 134 additions and 48 deletions

View file

@ -46,24 +46,25 @@ public class ToDoConstants {
// 34. Investigate routing (bicycle, car)
// 36. Postcode search
// 37. Get rid of exit button (!). Think about when notification should go & how clear resources if it is necessary
// 38. Add Button in search navigate to.
// 38. Add button in search "navigate to".
// BUGS Android
// 1. Fix bug with navigation layout (less zoom controls) (fixed).
// 4. Fix layout problems with add comment (fixed)
// 3. Implement clear existing area with tiles (update map)
// 1. Fix bug with navigation layout (less zoom controls) [fixed].
// 4. Fix layout problems with add comment [fixed]
// 7. Fix set location (clear sync with gps) [fixed]
// 3. Implement clear existing area with tiles (update map) [fixed]
// 6. Implement context menu for long press & trackball press [fixed - trackball todo]
// 2. Include to amenity index : historic, sport, ....
// 5. Implement caching files existing on FS, implement specific method in RM
// 7. Fix set location (clear sync with gps)
// Improvements
// 6. Implement context menu for long press & trackball press
// TODO swing
// 2. Internal (Simplify MapPanel - introduce layers for it)ю
// 3. Implement clear progress.
// 4. Fix issues with big files (such as netherlands)
// 1. Download tiles without using dir tiles

View file

@ -1,9 +1,5 @@
package com.osmand.osm.util;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
@ -21,11 +17,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.UIManager;
import javax.xml.stream.XMLStreamException;
import org.xml.sax.SAXException;
import com.osmand.data.DataTileManager;
@ -40,8 +31,6 @@ import com.osmand.osm.Way;
import com.osmand.osm.OSMSettings.OSMTagKey;
import com.osmand.osm.io.IOsmStorageFilter;
import com.osmand.osm.io.OsmBaseStorage;
import com.osmand.osm.io.OsmStorageWriter;
import com.osmand.swing.DataExtractionSettings;
import com.osmand.swing.MapPanel;
public class MinskTransReader {

View file

@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/map_context_menu" android:menuCategory="container"><item android:id="@+id/map_show_settings" android:title="@string/settings_Button"></item>
<item android:title="@string/mark_point" android:id="@+id/map_mark_point"></item>
<item android:title="@string/navigate_to_point" android:id="@+id/map_navigate_to_point"></item>
<item android:title="@string/map_specify_point" android:id="@+id/map_specify_point"></item>
<group android:id="@+id/map_context_menu" android:menuCategory="container">
<item android:title="@string/mark_point" android:id="@+id/map_mark_point" android:icon="@android:drawable/ic_menu_mylocation"></item>
<item android:id="@+id/map_navigate_to_point" android:title="@string/stop_navigation" android:visible="false" android:icon="@android:drawable/ic_menu_close_clear_cancel"></item>
<item android:id="@+id/map_reload_tile" android:title="@string/update_tile" android:icon="@android:drawable/ic_menu_view"></item>
<item android:title="@string/map_specify_point" android:id="@+id/map_specify_point" android:icon="@android:drawable/ic_menu_search"></item>
<item android:id="@+id/map_show_settings" android:title="@string/settings_Button" android:icon="@android:drawable/ic_menu_preferences"></item>
</group>
</menu>

View file

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="update_tile">Update map</string>
<string name="reload_tile">Reload tile</string>
<string name="user_name_descr">Input user name to communicate osm</string>
<string name="user_name">User name</string>
<string name="mark_point">Mark point</string>
<string name="mark_point">Target</string>
<string name="show_osm_bugs_descr">Show open street bugs on map</string>
<string name="show_osm_bugs">Show open street bugs</string>
<string name="favourites_activity">List of favourite points</string>

View file

@ -81,11 +81,11 @@ public class ResourceManager {
////////////////////////////////////////////// Working with tiles ////////////////////////////////////////////////
public Bitmap getTileImageForMapAsync(ITileSource map, int x, int y, int zoom, boolean loadFromInternetIfNeeded) {
return getTileImageForMap(map, x, y, zoom, loadFromInternetIfNeeded, false, true);
}
public Bitmap getTileImageFromCache(ITileSource map, int x, int y, int zoom){
return getTileImageForMap(map, x, y, zoom, false, false, false);
}
@ -99,10 +99,18 @@ public class ResourceManager {
return false;
}
public void clearTileImageForMap(ITileSource map, int x, int y, int zoom){
getTileImageForMap(map, x, y, zoom, true, false, false, true);
}
protected Bitmap getTileImageForMap(ITileSource map, int x, int y, int zoom,
boolean loadFromInternetIfNeeded, boolean sync, boolean loadFromFs) {
return getTileImageForMap(map, x, y, zoom, loadFromInternetIfNeeded, sync, loadFromFs, false);
}
// introduce cache in order save memory
protected StringBuilder builder = new StringBuilder(40);
protected synchronized Bitmap getTileImageForMap(ITileSource map, int x, int y, int zoom,
boolean loadFromInternetIfNeeded, boolean sync, boolean loadFromFs) {
boolean loadFromInternetIfNeeded, boolean sync, boolean loadFromFs, boolean deleteBefore) {
if (map == null) {
return null;
}
@ -110,6 +118,14 @@ public class ResourceManager {
builder.append(map.getName()).append('/').append(zoom). append('/').append(x).
append('/').append(y).append(map.getTileFormat()).append(".tile");
String file = builder.toString();
if(deleteBefore){
cacheOfImages.remove(file);
File f = new File(dirWithTiles, file);
if(f.exists()){
f.delete();
}
}
if (loadFromFs && cacheOfImages.get(file) == null) {
String url = loadFromInternetIfNeeded ? map.getUrlToLoad(x, y, zoom) : null;
TileLoadDownloadRequest req = new TileLoadDownloadRequest(dirWithTiles, file, url, new File(dirWithTiles, file),

View file

@ -6,6 +6,7 @@ import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.PointF;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@ -67,6 +68,8 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
private WakeLock wakeLock;
private boolean sensorRegistered = false;
private MenuItem navigateToPointMenu;
private boolean isMapLinkedToLocation(){
return OsmandSettings.isMapSyncToGpsLocation(this);
}
@ -149,6 +152,22 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
}
});
mapView.setOnLongClickListener(new OsmandMapTileView.OnLongClickListener(){
@Override
public boolean onLongPressEvent(PointF point) {
float dx = point.x - mapView.getCenterPointX();
float dy = point.y - mapView.getCenterPointY();
float fy = mapView.calcDiffTileY(dx, dy);
float fx = mapView.calcDiffTileX(dx, dy);
double latitude = MapUtils.getLatitudeFromTile(mapView.getZoom(), mapView.getYTile() + fy);
double longitude = MapUtils.getLongitudeFromTile(mapView.getZoom(), mapView.getXTile() + fx);
contextMenuPoint(latitude, longitude);
return true;
}
});
}
@ -172,6 +191,10 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
double lon = MapUtils.getLongitudeFromTile(mapView.getZoom(), x);
setMapLocation(lat, lon);
return true;
// that doesn't work for now
// } else if(event.getAction() == MotionEvent.ACTION_UP){
// contextMenuPoint(mapView.getLatitude(), mapView.getLongitude());
// return true;
}
return super.onTrackballEvent(event);
}
@ -225,13 +248,13 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
}
public void navigateToPoint(LatLon point){
if(point != null){
OsmandSettings.setPointToNavigate(this, point.getLatitude(), point.getLongitude());
} else {
OsmandSettings.clearPointToNavigate(this);
}
navigationLayer.setPointToNavigate(point);
updateNavigateToPointMenu();
}
public Location getLastKnownLocation(){
@ -373,18 +396,21 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
locationLayer.setHeading(event.values[0]);
}
private void updateNavigateToPointMenu(){
if (navigateToPointMenu != null) {
if (OsmandSettings.getPointToNavigate(this) != null) {
navigateToPointMenu.setVisible(true);
} else {
navigateToPointMenu.setVisible(false);
}
}
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.map_menu, menu);
MenuItem item = menu.findItem(R.id.map_navigate_to_point);
if (item != null) {
if (OsmandSettings.getPointToNavigate(this) != null) {
item.setTitle(R.string.stop_navigation);
} else {
item.setTitle(R.string.navigate_to_point);
}
}
navigateToPointMenu = menu.findItem(R.id.map_navigate_to_point);
updateNavigateToPointMenu();
return true;
}
@ -395,7 +421,10 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
startActivity(settings);
return true;
} else if (item.getItemId() == R.id.map_mark_point) {
markPoint();
contextMenuPoint(mapView.getLatitude(), mapView.getLongitude());
return true;
} else if (item.getItemId() == R.id.map_reload_tile) {
reloadTile(mapView.getZoom(), mapView.getLatitude(), mapView.getLongitude());
return true;
} else if (item.getItemId() == R.id.map_specify_point) {
openChangeLocationDialog();
@ -410,18 +439,36 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
return super.onOptionsItemSelected(item);
}
protected void markPoint(){
protected void reloadTile(final int zoom, final double latitude, final double longitude){
Builder builder = new AlertDialog.Builder(this);
builder.setItems(new String[]{"Navigate to point", "Add to favourites", "Open osm bug"}, new DialogInterface.OnClickListener(){
builder.setMessage("Tile image will be removed from file system. Do you want to reload tile from internet?");
builder.setNegativeButton("Cancel", null);
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
int x = (int) MapUtils.getTileNumberX(zoom, longitude);
int y = (int) MapUtils.getTileNumberY(zoom, latitude);
ResourceManager.getResourceManager().clearTileImageForMap(mapView.getMap(), x, y, zoom);
mapView.refreshMap();
}
});
builder.create().show();
}
protected void contextMenuPoint(final double latitude, final double longitude){
Builder builder = new AlertDialog.Builder(this);
builder.setItems(new String[]{"Navigate to point", "Add to favourites", "Update map", "Open osm bug"}, new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
if(which == 0){
navigateToPoint(new LatLon(mapView.getLatitude(), mapView.getLongitude()));
navigateToPoint(new LatLon(latitude, longitude));
} else if(which == 1){
addFavouritePoint();
addFavouritePoint(latitude, longitude);
} else if(which == 2){
osmBugsLayer.openBug(MapActivity.this, getLayoutInflater(), mapView);
reloadTile(mapView.getZoom(), latitude, longitude);
} else if(which == 3){
osmBugsLayer.openBug(MapActivity.this, getLayoutInflater(), mapView, latitude, longitude);
}
}
});
@ -429,10 +476,10 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
}
protected void addFavouritePoint(){
protected void addFavouritePoint(double latitude, double longitude){
final FavouritePoint p = new FavouritesActivity.FavouritePoint();
p.setLatitude(mapView.getLatitude());
p.setLongitude(mapView.getLongitude());
p.setLatitude(latitude);
p.setLongitude(longitude);
p.setName("Favourite");
Builder builder = new AlertDialog.Builder(this);

View file

@ -113,6 +113,9 @@ public class MapInfoLayer implements OsmandMapLayer {
}
}
}
} else {
cachedMeters = 0;
cachedDistString = null;
}
if(view.getZoom() != cachedZoom){
cachedZoom = view.getZoom();

View file

@ -338,7 +338,7 @@ public class OsmBugsLayer implements OsmandMapLayer {
}
public void openBug(final Context ctx, LayoutInflater layoutInflater, final OsmandMapTileView mapView){
public void openBug(final Context ctx, LayoutInflater layoutInflater, final OsmandMapTileView mapView, final double latitude, final double longitude){
Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle("Input text of bug");
final View view = layoutInflater.inflate(R.layout.open_bug, null);
@ -351,7 +351,7 @@ public class OsmBugsLayer implements OsmandMapLayer {
String text = ((EditText)view.findViewById(R.id.BugMessage)).getText().toString();
String author = ((EditText)view.findViewById(R.id.AuthorName)).getText().toString();
OsmandSettings.setUserName(ctx, author);
boolean bug = createNewBug(mapView.getLatitude(), mapView.getLongitude(),
boolean bug = createNewBug(latitude, longitude,
text, author);
if (bug) {
Toast.makeText(ctx, "Bug was successfully created", Toast.LENGTH_LONG).show();

View file

@ -45,6 +45,13 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
protected final int timeForDraggingAnimation = 300;
protected final int minimumDistanceForDraggingAnimation = 40;
public interface OnLongClickListener {
public boolean onLongPressEvent(PointF point);
}
public interface OnClickListener {
public boolean onPressEvent(PointF point);
}
protected static final Log log = LogUtil.getLog(OsmandMapTileView.class);
/**
@ -65,6 +72,10 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
private IMapLocationListener locationListener;
private OnLongClickListener onLongClickListener;
private OnClickListener onClickListener;
private List<OsmandMapLayer> layers = new ArrayList<OsmandMapLayer>();
// UI Part
@ -120,8 +131,8 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
setClickable(true);
setLongClickable(true);
setOnLongClickListener(this);
setOnClickListener(this);
super.setOnLongClickListener(this);
super.setOnClickListener(this);
getHolder().addCallback(this);
@ -620,9 +631,21 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
return true;
}
}
if(onLongClickListener != null && onLongClickListener.onLongPressEvent(point)){
return true;
}
}
return false;
}
public void setOnLongClickListener(OnLongClickListener l) {
this.onLongClickListener = l;
}
public void setOnClickListener(OnClickListener l) {
this.onClickListener = l;
}
@Override
public void onClick(View v) {
@ -637,9 +660,13 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
return;
}
}
if(onClickListener != null && onClickListener.onPressEvent(point)){
return;
}
}
}