diff --git a/OsmAnd/res/drawable-hdpi/map_btn_signpost_o.png b/OsmAnd/res/drawable-hdpi/map_btn_signpost_o.png
new file mode 100644
index 0000000000..8f0214ace6
Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/map_btn_signpost_o.png differ
diff --git a/OsmAnd/res/drawable-hdpi/map_btn_signpost_p.png b/OsmAnd/res/drawable-hdpi/map_btn_signpost_p.png
new file mode 100644
index 0000000000..5573f531f5
Binary files /dev/null and b/OsmAnd/res/drawable-hdpi/map_btn_signpost_p.png differ
diff --git a/OsmAnd/res/drawable-large/map_btn_signpost_o.png b/OsmAnd/res/drawable-large/map_btn_signpost_o.png
new file mode 100644
index 0000000000..8f0214ace6
Binary files /dev/null and b/OsmAnd/res/drawable-large/map_btn_signpost_o.png differ
diff --git a/OsmAnd/res/drawable-large/map_btn_signpost_p.png b/OsmAnd/res/drawable-large/map_btn_signpost_p.png
new file mode 100644
index 0000000000..5573f531f5
Binary files /dev/null and b/OsmAnd/res/drawable-large/map_btn_signpost_p.png differ
diff --git a/OsmAnd/res/drawable/map_btn_info.xml b/OsmAnd/res/drawable/map_btn_info.xml
index 716cf94498..3430164b08 100644
--- a/OsmAnd/res/drawable/map_btn_info.xml
+++ b/OsmAnd/res/drawable/map_btn_info.xml
@@ -2,5 +2,6 @@
+
diff --git a/OsmAnd/res/drawable/map_btn_signpost.xml b/OsmAnd/res/drawable/map_btn_signpost.xml
new file mode 100644
index 0000000000..2ba7595ef6
--- /dev/null
+++ b/OsmAnd/res/drawable/map_btn_signpost.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/OsmAnd/res/layout/configuration_dialog.xml b/OsmAnd/res/layout/configuration_dialog.xml
index cc035cf5ac..b9a7e3f58f 100644
--- a/OsmAnd/res/layout/configuration_dialog.xml
+++ b/OsmAnd/res/layout/configuration_dialog.xml
@@ -3,8 +3,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java b/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java
index 55094c8c07..f8b07c3dc0 100644
--- a/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java
+++ b/OsmAnd/src/net/osmand/plus/SQLiteTileSource.java
@@ -43,6 +43,7 @@ public class SQLiteTileSource implements ITileSource {
static final int tileSize = 256;
private ClientContext ctx;
+ private boolean onlyReadonlyAvailable = false;
@@ -143,7 +144,13 @@ public class SQLiteTileSource implements ITileSource {
protected SQLiteConnection getDatabase(){
if((db == null || db.isClosed()) && file.exists() ){
- db = ctx.getSQLiteAPI().openByAbsolutePath(file.getAbsolutePath(), false);
+ try {
+ onlyReadonlyAvailable = false;
+ db = ctx.getSQLiteAPI().openByAbsolutePath(file.getAbsolutePath(), false);
+ } catch(RuntimeException e) {
+ onlyReadonlyAvailable = true;
+ db = ctx.getSQLiteAPI().openByAbsolutePath(file.getAbsolutePath(), true);
+ }
try {
SQLiteCursor cursor = db.rawQuery("SELECT * FROM info", null);
if(cursor.moveToFirst()) {
@@ -205,8 +212,10 @@ public class SQLiteTileSource implements ITileSource {
}
private void addInfoColumn(String columnName, String value) {
- db.execSQL("alter table info add column "+columnName+" TEXT");
- db.execSQL("update info set "+columnName+" = '"+value+"'");
+ if(!onlyReadonlyAvailable) {
+ db.execSQL("alter table info add column "+columnName+" TEXT");
+ db.execSQL("update info set "+columnName+" = '"+value+"'");
+ }
}
private boolean hasTimeColumn() {
@@ -339,7 +348,7 @@ public class SQLiteTileSource implements ITileSource {
*/
public synchronized void insertImage(int x, int y, int zoom, File fileToSave) throws IOException {
SQLiteConnection db = getDatabase();
- if (db == null || db.isReadOnly()) {
+ if (db == null || db.isReadOnly() || onlyReadonlyAvailable) {
return;
}
if (exists(x, y, zoom)) {
@@ -384,7 +393,7 @@ public class SQLiteTileSource implements ITileSource {
@Override
public boolean couldBeDownloadedFromInternet() {
- if(getDatabase() == null || getDatabase().isReadOnly()){
+ if(getDatabase() == null || getDatabase().isReadOnly() || onlyReadonlyAvailable){
return false;
}
return urlTemplate != null;
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
index 3ba1e73e29..6d6556a2ac 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java
@@ -22,6 +22,7 @@ import net.osmand.data.LatLon;
import net.osmand.data.QuadRect;
import net.osmand.data.RotatedTileBox;
import net.osmand.map.ITileSource;
+import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
import net.osmand.plus.FavouritesDbHelper;
@@ -382,7 +383,9 @@ public class MapActivityActions implements DialogProvider {
adapter.item(R.string.context_menu_item_destination_point).icons(R.drawable.ic_action_flag_dark,
R.drawable.ic_action_flag_light).reg();
}
- adapter.item(R.string.context_menu_item_directions_from).icons(R.drawable.ic_action_gdirections_dark, R.drawable.ic_action_gdirections_light).reg();
+ if(!mapActivity.getRoutingHelper().isFollowingMode()) {
+ adapter.item(R.string.context_menu_item_directions_from).icons(R.drawable.ic_action_gdirections_dark, R.drawable.ic_action_gdirections_light).reg();
+ }
adapter.item(R.string.context_menu_item_search).icons(R.drawable.ic_action_search_dark,
R.drawable.ic_action_search_light).reg();
adapter.item(R.string.context_menu_item_share_location).icons(
@@ -433,9 +436,20 @@ public class MapActivityActions implements DialogProvider {
Location loc = new Location("map");
loc.setLatitude(latitude);
loc.setLongitude(longitude);
+ ApplicationMode mode = settings.DEFAULT_APPLICATION_MODE.get();
+ if(mode == ApplicationMode.DEFAULT) {
+ mode = ApplicationMode.CAR;
+ }
+ OsmandApplication app = mapActivity.getMyApplication();
+ app.getSettings().APPLICATION_MODE.set(mode);
+ app.getRoutingHelper().setAppMode(mode);
+ // save application mode controls
+ settings.FOLLOW_THE_ROUTE.set(false);
+ settings.FOLLOW_THE_GPX_ROUTE.set(null);
+ app.getRoutingHelper().setFollowingMode(false);
+ app.getRoutingHelper().setFinalAndCurrentLocation(targets.getPointToNavigate(), targets.getIntermediatePoints(), loc, null);
String name = mapActivity.getMapLayers().getContextMenuLayer().getSelectedObjectName();
- new NavigateAction(mapActivity).
- getDirections(loc, name, DirectionDialogStyle.create().gpxRouteEnabled().routeFromMapPoint());
+ // TODO use as point name
}
} else if (standardId == R.string.context_menu_item_intermediate_point ||
standardId == R.string.context_menu_item_destination_point) {
diff --git a/OsmAnd/src/net/osmand/plus/activities/actions/NavigateAction.java b/OsmAnd/src/net/osmand/plus/activities/actions/NavigateAction.java
index 308f879235..125f7e73e7 100644
--- a/OsmAnd/src/net/osmand/plus/activities/actions/NavigateAction.java
+++ b/OsmAnd/src/net/osmand/plus/activities/actions/NavigateAction.java
@@ -20,6 +20,7 @@ import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.routing.RouteProvider.GPXRouteParams;
import net.osmand.plus.routing.RouteProvider.RouteService;
import net.osmand.plus.routing.RouteProvider.GPXRouteParams.GPXRouteParamsBuilder;
+import net.osmand.plus.views.OsmandMapTileView;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
@@ -132,6 +133,27 @@ public class NavigateAction {
return true;
}
+
+ public View createDialogView() {
+ final View view = mapActivity.getLayoutInflater().inflate(R.layout.calculate_route, null);
+ OsmandMapTileView mapView = mapActivity.getMapView();
+ Location loc = new Location("map");
+ loc.setLatitude(mapView.getLatitude());
+ loc.setLongitude(mapView.getLongitude());
+ String name = null;
+ DirectionDialogStyle style = DirectionDialogStyle.create();
+ final Spinner fromSpinner = setupFromSpinner(loc, name, view, style);
+ final List toList = new ArrayList();
+ final Spinner toSpinner = setupToSpinner(loc, name, view, toList, style);
+ String via = generateViaDescription();
+ if(via.length() == 0){
+ ((TextView) view.findViewById(R.id.ViaView)).setVisibility(View.GONE);
+ } else {
+ ((TextView) view.findViewById(R.id.ViaView)).setVisibility(View.VISIBLE);
+ ((TextView) view.findViewById(R.id.ViaView)).setText(via);
+ }
+ return view;
+ }
public void getDirections(final Location mapView, String name, DirectionDialogStyle style) {
final Location current = getLastKnownLocation();
Builder builder = new AlertDialog.Builder(mapActivity);
diff --git a/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java b/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java
index b422e94675..1a594b5383 100644
--- a/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java
+++ b/OsmAnd/src/net/osmand/plus/render/NativeOsmandLibrary.java
@@ -39,28 +39,18 @@ public class NativeOsmandLibrary extends NativeLibrary {
System.loadLibrary("gnustl_shared");
log.debug("Loading native cpufeatures_proxy..."); //$NON-NLS-1$
System.loadLibrary("cpufeatures_proxy");
- if(android.os.Build.VERSION.SDK_INT >= 8) {
+ if (android.os.Build.VERSION.SDK_INT >= 8) {
log.debug("Loading jnigraphics, since Android >= 2.2 ..."); //$NON-NLS-1$
System.loadLibrary("jnigraphics");
}
final String libCpuSuffix = cpuHasNeonSupport() ? "_neon" : "";
log.debug("Loading native libraries..."); //$NON-NLS-1$
- try {
- loadNewCore(libCpuSuffix);
- log.debug("Creating NativeOsmandLibrary instance..."); //$NON-NLS-1$
- library = new NativeOsmandLibrary(true);
- isNativeSupported = true;
- } catch(Error e) {
- log.error("Failed to load new native library", e); //$NON-NLS-1$
- }
- if(!isNativeSupported) {
- loadOldCore(libCpuSuffix);
- log.debug("Creating NativeOsmandLibrary instance..."); //$NON-NLS-1$
- library = new NativeOsmandLibrary(false);
- log.debug("Initializing rendering rules storage..."); //$NON-NLS-1$
- NativeOsmandLibrary.initRenderingRulesStorage(storage);
- isNativeSupported = true;
- }
+ loadOldCore(libCpuSuffix);
+ log.debug("Creating NativeOsmandLibrary instance..."); //$NON-NLS-1$
+ library = new NativeOsmandLibrary(false);
+ log.debug("Initializing rendering rules storage..."); //$NON-NLS-1$
+ NativeOsmandLibrary.initRenderingRulesStorage(storage);
+ isNativeSupported = true;
} catch (Throwable e) {
log.error("Failed to load native library", e); //$NON-NLS-1$
}
@@ -74,17 +64,6 @@ public class NativeOsmandLibrary extends NativeLibrary {
System.loadLibrary("osmand" + libCpuSuffix);
}
- private static void loadNewCore(final String libCpuSuffix) {
-// System.loadLibrary("Qt5Core" + libCpuSuffix);
-// System.loadLibrary("Qt5Network" + libCpuSuffix);
-// System.loadLibrary("Qt5Concurrent" + libCpuSuffix);
-// System.loadLibrary("Qt5Sql" + libCpuSuffix);
-// System.loadLibrary("Qt5Xml" + libCpuSuffix);
-// System.loadLibrary("OsmAndCore" + libCpuSuffix);
-// System.loadLibrary("OsmAndCoreUtils" + libCpuSuffix);
- System.loadLibrary("OsmAndJNI" + libCpuSuffix);
- }
-
public static boolean isSupported()
{
return isNativeSupported != null && isNativeSupported;
diff --git a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java
index 7eaa336022..0f27202aeb 100644
--- a/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java
+++ b/OsmAnd/src/net/osmand/plus/routing/RoutingHelper.java
@@ -749,7 +749,10 @@ public class RoutingHelper {
}
lastTimeEvaluatedRoute = System.currentTimeMillis();
}
-
+ }
+
+ public void recalculateRouteDueToSettingsChange() {
+ recalculateRouteInBackground(lastFixedLocation, finalLocation, intermediatePoints, currentGPXRoute, null);
}
private void recalculateRouteInBackground(final Location start, final LatLon end, final List intermediates, final GPXRouteParams gpxRoute, final RouteCalculationResult previousRoute){
diff --git a/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java b/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java
index 32878fe3f8..1e13b16b7a 100644
--- a/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java
+++ b/OsmAnd/src/net/osmand/plus/views/MapInfoLayer.java
@@ -416,7 +416,7 @@ public class MapInfoLayer extends OsmandMapLayer {
}
};
Builder b = new AlertDialog.Builder(map);
- View confirmDialog = view.inflate(view.getContext(), R.layout.configuration_dialog, null);
+ View confirmDialog = View.inflate(view.getContext(), R.layout.configuration_dialog, null);
final ListView lv = (ListView) confirmDialog.findViewById(android.R.id.list);
NavigateAction.prepareAppModeView(map, selected, true,
(ViewGroup) confirmDialog.findViewById(R.id.TopBar), true,
diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java
index 62e53ce33e..556a78fa21 100644
--- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java
+++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java
@@ -454,7 +454,7 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
Canvas canvas = holder.lockCanvas();
if (canvas != null) {
try {
- final float ratioy = mapPosition == OsmandSettings.BOTTOM_CONSTANT ? 0.8f : 0.5f;
+ final float ratioy = mapPosition == OsmandSettings.BOTTOM_CONSTANT ? 0.9f : 0.5f;
final int cy = (int) (ratioy * getHeight());
if(currentViewport.getPixWidth() != getWidth() || currentViewport.getPixHeight() != getHeight() ||
currentViewport.getCenterPixelY() != cy) {
diff --git a/OsmAnd/src/net/osmand/plus/views/controls/MapAppModeControl.java b/OsmAnd/src/net/osmand/plus/views/controls/MapAppModeControl.java
index 142b7ee2ac..619d320bae 100644
--- a/OsmAnd/src/net/osmand/plus/views/controls/MapAppModeControl.java
+++ b/OsmAnd/src/net/osmand/plus/views/controls/MapAppModeControl.java
@@ -1,23 +1,35 @@
package net.osmand.plus.views.controls;
+import java.util.HashSet;
+import java.util.Set;
+
import net.osmand.data.RotatedTileBox;
+import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
+import net.osmand.plus.activities.actions.NavigateAction;
import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnDismissListener;
import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
import android.os.Handler;
+import android.view.Gravity;
import android.view.View;
-import android.widget.Button;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
import android.widget.FrameLayout;
+import android.widget.ImageButton;
+import android.widget.ListView;
public class MapAppModeControl extends MapControls {
- private Button settingsAppModeButton;
+ private ImageButton settingsAppModeButton;
private OsmandSettings settings;
- private Drawable drawable;
private int cachedId;
+ private Dialog dialog;
public MapAppModeControl(MapActivity mapActivity, Handler showUIHandler, float scaleCoefficient) {
@@ -27,14 +39,71 @@ public class MapAppModeControl extends MapControls {
@Override
public void showControls(FrameLayout parent) {
- settingsAppModeButton = addButton(parent, R.string.routing_preferences_descr, R.drawable.map_btn_plain);
+ settingsAppModeButton = addImageButton(parent, R.string.routing_preferences_descr, R.drawable.map_btn_plain);
+ cachedId = 0;
settingsAppModeButton.setOnClickListener(new View.OnClickListener() {
+
@Override
public void onClick(View v) {
- // TODO
+ if(dialog != null) {
+ dialog.hide();
+ dialog = null;
+ settingsAppModeButton.setBackgroundResource(R.drawable.map_btn_plain);
+ } else {
+ dialog = showDialog();
+ dialog.show();
+ settingsAppModeButton.setBackgroundResource(R.drawable.map_btn_plain_p);
+ dialog.setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dlg) {
+ settingsAppModeButton.setBackgroundResource(R.drawable.map_btn_plain);
+ dialog = null;
+ }
+ });
+ }
}
});
}
+
+ private Dialog showDialog() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(mapActivity);
+ View ll = createLayout();
+ builder.setView(ll);
+ Dialog dialog = builder.create();
+ dialog.setCanceledOnTouchOutside(true);
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
+ lp.copyFrom(dialog.getWindow().getAttributes());
+ lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
+ lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
+ lp.gravity = Gravity.BOTTOM;
+ lp.y = (int) (settingsAppModeButton.getBottom() - settingsAppModeButton.getTop() + scaleCoefficient * 5);
+ dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+ dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+ dialog.getWindow().setAttributes(lp);
+ return dialog;
+ }
+
+ private View createLayout() {
+ View settingsDlg = View.inflate(mapActivity, R.layout.plan_route_settings, null);
+ final OsmandSettings settings = mapActivity.getMyApplication().getSettings();
+ ApplicationMode am = settings.APPLICATION_MODE.get();
+ final ListView lv = (ListView) settingsDlg.findViewById(android.R.id.list);
+ final Set selected = new HashSet();
+ selected.add(am);
+ NavigateAction.prepareAppModeView(mapActivity, selected, false,
+ (ViewGroup) settingsDlg.findViewById(R.id.TopBar), true,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if(selected.size() > 0) {
+ settings.APPLICATION_MODE.set(selected.iterator().next());
+ mapActivity.getRoutingHelper().recalculateRouteDueToSettingsChange();
+ //listAdapter.notifyDataSetChanged();
+ }
+ }
+ });
+ return settingsDlg;
+ }
@Override
public void hideControls(FrameLayout layout) {
@@ -43,24 +112,12 @@ public class MapAppModeControl extends MapControls {
mapActivity.accessibleContent.remove(settingsAppModeButton);
}
- @SuppressWarnings("deprecation")
@Override
public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings nightMode) {
- int id = settings.getApplicationMode().getIconId();
+ int id = settings.getApplicationMode().getSmallIcon(settingsAppModeButton.isPressed() || dialog != null);
if(cachedId != id && settingsAppModeButton.getLeft() > 0) {
cachedId = id;
-// drawable = mapActivity.getResources().getDrawable(id);
-// int h = drawable.getMinimumHeight() / 2;
-// int w = drawable.getMinimumWidth() / 2;
-// int cx = (settingsAppModeButton.getLeft() + settingsAppModeButton.getRight()) / 2;
-// int cy = (settingsAppModeButton.getTop() + settingsAppModeButton.getBottom()) / 2;
-// drawable.setBounds(cx - w, cy - h, cx + w, cy + h);
- settingsAppModeButton.setBackgroundDrawable(new LayerDrawable(new Drawable[] {
- mapActivity.getResources().getDrawable(R.drawable.map_btn_plain), drawable }));
+ settingsAppModeButton.setImageResource(id);
}
- if(drawable != null) {
- drawable.draw(canvas);
- }
-
}
}
diff --git a/OsmAnd/src/net/osmand/plus/views/controls/MapControls.java b/OsmAnd/src/net/osmand/plus/views/controls/MapControls.java
index 8be1ff3bf2..739c9265b3 100644
--- a/OsmAnd/src/net/osmand/plus/views/controls/MapControls.java
+++ b/OsmAnd/src/net/osmand/plus/views/controls/MapControls.java
@@ -12,6 +12,7 @@ import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
+import android.widget.ImageButton;
public abstract class MapControls {
@@ -47,6 +48,13 @@ public abstract class MapControls {
this.vmargin = vmargin;
}
+ protected ImageButton addImageButton(FrameLayout parent, int stringId, int resourceId) {
+ Context ctx = mapActivity;
+ ImageButton button = new ImageButton(ctx);
+ applyAttributes(ctx, parent, button, stringId, resourceId, 0);
+ return button;
+ }
+
protected Button addButton(FrameLayout parent, int stringId, int resourceId) {
return addButton(parent, stringId, resourceId, 0);
}
@@ -54,6 +62,13 @@ public abstract class MapControls {
protected Button addButton(FrameLayout parent, int stringId, int resourceId, int extraMargin) {
Context ctx = mapActivity;
Button button = new Button(ctx);
+ applyAttributes(ctx, parent, button, stringId, resourceId, extraMargin);
+ return button;
+ }
+
+
+ private void applyAttributes(Context ctx, FrameLayout parent, View button, int stringId, int resourceId,
+ int extraMargin) {
button.setContentDescription(ctx.getString(stringId));
button.setBackgroundResource(resourceId);
Drawable d = ctx.getResources().getDrawable(resourceId);
@@ -72,7 +87,6 @@ public abstract class MapControls {
parent.addView(button, params);
button.setEnabled(true);
mapActivity.accessibleContent.add(button);
- return button;
}
protected void removeButton(FrameLayout layout, View b) {
diff --git a/OsmAnd/src/net/osmand/plus/views/controls/MapRouteInfoControl.java b/OsmAnd/src/net/osmand/plus/views/controls/MapRouteInfoControl.java
index 78905513ae..5011cb42de 100644
--- a/OsmAnd/src/net/osmand/plus/views/controls/MapRouteInfoControl.java
+++ b/OsmAnd/src/net/osmand/plus/views/controls/MapRouteInfoControl.java
@@ -2,25 +2,31 @@ package net.osmand.plus.views.controls;
import net.osmand.data.LatLon;
import net.osmand.data.RotatedTileBox;
-import net.osmand.plus.ClientContext;
+import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.ShowRouteInfoActivity;
+import net.osmand.plus.activities.actions.NavigateAction;
import net.osmand.plus.routing.RouteDirectionInfo;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.routing.RoutingHelper.IRouteInformationListener;
import net.osmand.plus.views.ContextMenuLayer;
import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
import net.osmand.plus.views.OsmandMapTileView;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
-import android.widget.FrameLayout.LayoutParams;
import android.widget.ImageButton;
import android.widget.LinearLayout;
@@ -32,9 +38,10 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
private final ContextMenuLayer contextMenu;
private final RoutingHelper routingHelper;
private OsmandMapTileView mapView;
- private View next;
- private View prev;
- private View info;
+ private ImageButton next;
+ private ImageButton prev;
+ private ImageButton info;
+ private Dialog dialog;
public MapRouteInfoControl(ContextMenuLayer contextMenu,
@@ -43,20 +50,67 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
this.contextMenu = contextMenu;
routingHelper = mapActivity.getRoutingHelper();
mapView = mapActivity.getMapView();
+ routingHelper.addListener(this);
}
@Override
public void showControls(FrameLayout parent) {
- infoButton = addButton(parent, R.string.info_button, R.drawable.map_btn_info);
+ infoButton = addButton(parent, R.string.info_button, R.drawable.map_btn_signpost);
controlVisible = true;
infoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- // TODO
+ if(dialog != null) {
+ dialog.hide();
+ dialog = null;
+ infoButton.setBackgroundResource(R.drawable.map_btn_signpost);
+ } else {
+ dialog = showDialog();
+ dialog.show();
+ infoButton.setBackgroundResource(R.drawable.map_btn_signpost_p);
+ dialog.setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dlg) {
+ infoButton.setBackgroundResource(R.drawable.map_btn_signpost);
+ dialog = null;
+ }
+ });
+ }
}
});
}
+ private Dialog showDialog() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(mapActivity);
+ LinearLayout lmain = new LinearLayout(mapActivity);
+ lmain.setOrientation(LinearLayout.VERTICAL);
+ boolean addButtons = routingHelper.isRouteCalculated();
+ if(addButtons) {
+ LinearLayout buttons = createButtonsLayout(scaleCoefficient);
+ lmain.addView(buttons);
+ }
+ View lv = new NavigateAction(mapActivity).createDialogView();
+ lv.setId(R.id.MainLayout);
+ lmain.addView(lv);
+ if(addButtons) {
+ attachListeners(lmain);
+ }
+ builder.setView(lmain);
+
+ Dialog dialog = builder.create();
+ dialog.setCanceledOnTouchOutside(true);
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
+ lp.copyFrom(dialog.getWindow().getAttributes());
+ lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
+ lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
+ lp.gravity = Gravity.BOTTOM;
+ lp.y = (int) (infoButton.getBottom() - infoButton.getTop() + scaleCoefficient * 5);
+ dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+ dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+ dialog.getWindow().setAttributes(lp);
+ return dialog;
+ }
+
public static int getDirectionInfo() {
return directionInfo;
}
@@ -83,43 +137,35 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
return width ;
}
-// public RouteInfoLayer(RoutingHelper routingHelper, MapActivity activity, ContextMenuLayer contextMenu){
-// createLayout(activity, activity.getMapView().getDensity());
-// this.routingHelper = routingHelper;
-// this.contextMenu = contextMenu;
-// routingHelper.addListener(this);
-// attachListeners(activity.getMyApplication());
-// updateVisibility();
-//
-// activity.accessibleContent.add(prev);
-// activity.accessibleContent.add(next);
-// activity.accessibleContent.add(info);
-// }
-
- private void createLayout(MapActivity activity, float density) {
- FrameLayout fl = (FrameLayout) activity.getMapView().getParent();
- LinearLayout ll = new LinearLayout(activity);
+ private LinearLayout createButtonsLayout(float density) {
+ LinearLayout ll = new LinearLayout(mapActivity);
+ ll.setGravity(Gravity.CENTER);
ll.setOrientation(LinearLayout.HORIZONTAL);
- ll.setPadding(0, 0, (int) (density * 15), (int) (density * 50));
- fl.addView(ll, new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER));
- prev = new ImageButton(activity);
- prev.setContentDescription(activity.getString(R.string.previous_button));
- prev.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.ax_1_navigation_previous_item_light));
+ ll.setPadding((int) (density * 10), (int) (density * 5), (int) (density * 10), (int) (density * 5));
+ prev = new ImageButton(mapActivity);
+ prev.setContentDescription(mapActivity.getString(R.string.previous_button));
+ prev.setImageResource(R.drawable.ax_1_navigation_previous_item_light);
+ prev.setAdjustViewBounds(true);
+ prev.setBackgroundResource(R.drawable.map_btn_plain);
ll.addView(prev);
- info = new ImageButton(activity);
- info.setContentDescription(activity.getString(R.string.info_button));
- info.setPadding((int) (density * 8), 0, 0, 0);
- info.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.ax_2_action_about_light));
+ info = new ImageButton(mapActivity);
+ info.setContentDescription(mapActivity.getString(R.string.info_button));
+ info.setBackgroundResource(R.drawable.map_btn_plain);
+ info.setAdjustViewBounds(true);
+ info.setImageResource(R.drawable.ax_2_action_about_light);
ll.addView(info);
- next = new ImageButton(activity);
- next.setContentDescription(activity.getString(R.string.next_button));
- next.setPadding((int) (density * 8), 0, 0, 0);
- next.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.ax_1_navigation_next_item_light));
+ next = new ImageButton(mapActivity);
+ next.setContentDescription(mapActivity.getString(R.string.next_button));
+ next.setBackgroundResource(R.drawable.map_btn_plain);
+ next.setAdjustViewBounds(true);
+ next.setImageResource(R.drawable.ax_1_navigation_next_item_light);
ll.addView(next);
+ return ll;
}
- private void attachListeners(final ClientContext ctx) {
+ private void attachListeners(final View mainView) {
+ final OsmandApplication ctx = mapActivity.getMyApplication();
prev.setOnClickListener(new View.OnClickListener(){
@Override
@@ -127,6 +173,7 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
if(routingHelper.getRouteDirections() != null && directionInfo > 0){
directionInfo--;
if(routingHelper.getRouteDirections().size() > directionInfo){
+ mainView.findViewById(R.id.MainLayout).setVisibility(View.GONE);
RouteDirectionInfo info = routingHelper.getRouteDirections().get(directionInfo);
net.osmand.Location l = routingHelper.getLocationFromRouteDirection(info);
contextMenu.setLocation(new LatLon(l.getLatitude(), l.getLongitude()), info.getDescriptionRoute(ctx));
@@ -138,10 +185,10 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
});
next.setOnClickListener(new View.OnClickListener(){
-
@Override
public void onClick(View v) {
if(routingHelper.getRouteDirections() != null && directionInfo < routingHelper.getRouteDirections().size() - 1){
+ mainView.findViewById(R.id.MainLayout).setVisibility(View.GONE);
directionInfo++;
RouteDirectionInfo info = routingHelper.getRouteDirections().get(directionInfo);
net.osmand.Location l = routingHelper.getLocationFromRouteDirection(info);
@@ -162,30 +209,24 @@ public class MapRouteInfoControl extends MapControls implements IRouteInformatio
});
}
- public boolean isVisible(){
+ public boolean isVisibleButtons(){
return routingHelper.isRouteCalculated() && !routingHelper.isFollowingMode();
}
- private void updateVisibility(){
- int vis = isVisible() ? View.VISIBLE : View.INVISIBLE;
- prev.setVisibility(vis);
- next.setVisibility(vis);
- info.setVisibility(vis);
- }
-
@Override
public void newRouteIsCalculated(boolean newRoute) {
directionInfo = -1;
- updateVisibility();
mapView.refreshMap();
}
@Override
public void routeWasCancelled() {
directionInfo = -1;
- updateVisibility();
+ if(dialog != null) {
+ dialog.hide();
+ dialog = null;
+ }
}
-
-
+
}