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; + } } - - + }