Conflicts:
	OsmAnd/res/values/phrases.xml
This commit is contained in:
xmd5a 2015-09-11 18:26:53 +03:00
commit a9cd1087ba
113 changed files with 1748 additions and 1204 deletions

View file

@ -1,6 +1,6 @@
OsmAnd OSM Automated Navigation Directions navigation software based on OpenStreetMap.
Copyright © 20102014 OsmAnd BV (Amstelveen, Netherlands - KvK 62066714).
Copyright © 20102015 OsmAnd BV (Amstelveen, Netherlands - KvK 62066714).
The code in that repository is mainly covered by *GPLv3*, except some 3rd party libs and resources.
ATTENTION: please be aware that some artwork has proprietary license.

View file

@ -281,13 +281,13 @@ public class NativeLibrary {
return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
}
public static void loadFontData(String dir) {
File dr = new File(dir);
if (dr.listFiles() == null) {
public void loadFontData(File dr) {
File[] lf = dr.listFiles();
if (lf == null) {
System.err.println("No fonts loaded from " + dr.getAbsolutePath());
return;
}
ArrayList<File> lst = new ArrayList<File>(Arrays.asList(dr.listFiles()));
ArrayList<File> lst = new ArrayList<File>(Arrays.asList(lf));
Collections.sort(lst, new Comparator<File>() {

View file

@ -67,16 +67,15 @@ public class BinaryInspector {
if(args.length == 1 && "test".equals(args[0])) {
in.inspector(new String[]{
// "-vpoi",
"-vmap", "-vmapobjects", // "-vmapcoordinates",
// "-vmap", "-vmapobjects", // "-vmapcoordinates",
// "-vrouting",
// "-vaddress", "-vcities","-vstreetgroups",
"-vaddress", "-vcities",//"-vstreetgroups",
// "-vstreets", "-vbuildings", "-vintersections",
// "-zoom=15",
// "-bbox=1.74,51.17,1.75,51.16",
// "-vstats",
"/Users/victorshcherb/osmand/temp/Germany_bremen_europe_15_08_00.obf"
// "/Users/victorshcherb/osmand/maps/Synthetic_test_rendering.obf"
// "/Users/victorshcherb/osmand/maps/Map.obf"
"/Users/victorshcherb/osmand/maps/Netherlands_gelderland_europe_2.obf"
// "/Users/victorshcherb/osmand/temp/Czech-republic_jihovychod_europe_2.road.obf"
});
} else {
@ -571,7 +570,7 @@ public class BinaryInspector {
BinaryMapAddressReaderAdapter.VILLAGES_TYPE,
BinaryMapAddressReaderAdapter.POSTCODES_TYPE
};
String lang = "ru";
String lang = "en";
for (int j = 0; j < cityType.length; j++) {
int type = cityType[j];

View file

@ -1,11 +1,6 @@
package net.osmand.util;
/* Can be commented out in order to run the main function separately */
import net.osmand.PlatformUtil;
import org.apache.commons.logging.Log;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@ -21,7 +16,6 @@ import java.util.Calendar;
* if the OSM feature is open at a certain time.
*/
public class OpeningHoursParser {
private static final Log LOG = PlatformUtil.getLog(OpeningHoursParser.class);
private static final String[] daysStr = new String[] {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
private static final String[] monthsStr = new String[] {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
@ -113,15 +107,6 @@ public class OpeningHoursParser {
public String getCurrentRuleTime(Calendar cal) {
String ruleOpen = null;
String ruleClosed = null;
for (OpeningHoursRule r : rules){
if(r.containsDay(cal) && r.containsMonth(cal)){
if(r.isOpenedForTime(cal, false)) {
ruleOpen = r.toRuleString(true);
} else {
ruleClosed = r.toRuleString(true);
}
}
}
for (OpeningHoursRule r : rules){
if(r.containsPreviousDay(cal) && r.containsMonth(cal)){
if(r.isOpenedForTime(cal, true)) {
@ -131,6 +116,16 @@ public class OpeningHoursParser {
}
}
}
for (OpeningHoursRule r : rules){
if(r.containsDay(cal) && r.containsMonth(cal)){
if(r.isOpenedForTime(cal, false)) {
ruleOpen = r.toRuleString(true);
} else {
ruleClosed = r.toRuleString(true);
}
}
}
if(ruleOpen != null) {
return ruleOpen;
}
@ -726,8 +721,8 @@ public class OpeningHoursParser {
Calendar cal = Calendar.getInstance();
cal.setTime(new SimpleDateFormat("dd.MM.yyyy HH:mm").parse(time));
boolean calculated = hours.isOpenedForTime(cal);
System.out.printf(" %sok: Expected %s: %b = %b\n",
((calculated != expected) ? "NOT " : ""), time, expected, calculated);
System.out.printf(" %sok: Expected %s: %b = %b (rule %s)\n",
((calculated != expected) ? "NOT " : ""), time, expected, calculated, hours.getCurrentRuleTime(cal));
if(calculated != expected) {
throw new IllegalArgumentException("BUG!!!");
}
@ -741,6 +736,12 @@ public class OpeningHoursParser {
testOpened("09.08.2012 11:00", hours, true);
testOpened("09.08.2012 16:00", hours, false);
hours = parseOpenedHours("Mo-Fr 11:30-15:00,17:30-23:00; Sa-Su,PH 11:30-23:00");
System.out.println(hours);
testOpened("7.09.2015 14:54", hours, true);
testOpened("7.09.2015 15:05", hours, false);
// two time and date ranges
hours = parseOpenedHours("Mo-We, Fr 08:30-14:40,15:00-19:00"); //$NON-NLS-1$
System.out.println(hours);

1
OsmAnd/.gitignore vendored
View file

@ -3,6 +3,7 @@ dist/
res/values/no_translate.xml
assets/specialphrases/*
assets/voice/*
assets/fonts/*
gen/
local.properties
raw/

View file

@ -43,14 +43,11 @@
<asset source="voice/ru/config.p" destination="voice/ru/_config.p" mode="overwriteOnlyIfExists" />
<!-- TODO delete deprecated
<asset source="voice/fr-ov/config.p" destination="voice/fr/_config.p" mode="overwriteOnlyIfExists" />
<asset source="voice/he-ov/config.p" destination="voice/he/_config.p" mode="overwriteOnlyIfExists" />
<asset source="voice/it-Chiara-ov/config.p" destination="voice/it-Chiara/_config.p" mode="overwriteOnlyIfExists" />
<asset source="voice/it-Roberto-ov/config.p" destination="voice/it-Roberto/_config.p" mode="overwriteOnlyIfExists" />
<asset source="voice/ru2-ov/config.p" destination="voice/ru2/_config.p" mode="overwriteOnlyIfExists" />
<asset source="voice/ru3-ov/config.p" destination="voice/ru3/_config.p" mode="overwriteOnlyIfExists" />
<asset source="voice/sk-Ruzena-ov/config.p" destination="voice/sk-Ruzena/_config.p" mode="overwriteOnlyIfExists" />
-->
<asset source="fonts/OpenSans-Italic.ttf" destination="fonts/OpenSans-Italic.ttf" mode="alwaysOverwriteOrCopy" />
<asset source="fonts/OpenSans-Regular.ttf" destination="fonts/OpenSans-Regular.ttf" mode="alwaysOverwriteOrCopy" />
<asset source="fonts/OpenSans-Semibold.ttf" destination="fonts/OpenSans-Semibold.ttf" mode="alwaysOverwriteOrCopy" />
<asset source="fonts/OpenSans-SemiboldItalic.ttf" destination="fonts/OpenSans-SemiboldItalic.ttf" mode="alwaysOverwriteOrCopy" />
<asset source="sounds/camera_click.ogg" destination="sounds/camera_click.ogg" mode="copyOnlyIfDoesNotExist" />
</assets>

View file

@ -19,7 +19,7 @@ apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "23.0.0"
buildToolsVersion "23.0.1"
signingConfigs {
development {
@ -190,6 +190,14 @@ task collectVoiceAssets(type: Sync) {
include "**/*.p"
}
task collectFonts(type: Copy) {
from "../../resources/fonts"
from "../../resources/rendering_styles/fonts/OpenSans"
into "assets/fonts"
include "*.ttf"
}
task collectHelpContentsAssets(type: Sync) {
from "../../help/help"
into "assets/help"
@ -237,6 +245,7 @@ task copyStyleIcons(type: Copy) {
task collectExternalResources << {}
collectExternalResources.dependsOn collectVoiceAssets,
collectFonts,
collectHelpContentsAssets,
collectRoutingResources,
collectRenderingStylesResources,

View file

@ -81,6 +81,14 @@
<include name="voice/**/*.p" />
</fileset>
</copy>
<copy todir="assets/fonts">
<fileset dir="../../resources/fonts">
<include name="*.ttf" />
</fileset>
<fileset dir="../../resources/rendering_styles/fonts/OpenSans">
<include name="*.ttf" />
</fileset>
</copy>
<copy todir="res/">
<fileset dir="../../resources/rendering_styles/style-icons/" >
<include name="**/*" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<nine-patch android:src="@drawable/bottom_shadow" />
<nine-patch android:src="@drawable/bg_contextmenu_dots_dark" />
</item>
<item>
<shape>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<nine-patch android:src="@drawable/bottom_shadow" />
<nine-patch android:src="@drawable/bg_contextmenu_dots_light" />
</item>
<item>
<shape>

View file

@ -6,6 +6,21 @@
android:paddingRight="7dp"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/favourites_edit_dialog_name" />
<EditText
android:id="@+id/nameEditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp" />
</TableRow>
<TableRow>
<TextView

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/bg_color"
android:background="?attr/spinnerListBackground"
android:clickable="true"
android:orientation="vertical"
tools:context="net.osmand.plus.osmedit.EditPoiFragment">
@ -97,7 +97,7 @@
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/pstsTabBackground"
android:background="?attr/bg_color"
app:layout_scrollFlags="scroll"
app:tabIndicatorColor="?attr/pstsIndicatorColor"
app:tabSelectedTextColor="?attr/pstsIndicatorColor"
@ -117,7 +117,7 @@
android:id="@+id/buttonDivider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_color"/>
android:background="?attr/dashboard_divider"/>
<LinearLayout
android:layout_width="fill_parent"
@ -128,18 +128,16 @@
<net.osmand.plus.widgets.ButtonEx
android:id="@+id/cancelButton"
style="@style/DashboardGeneralButton"
android:height="48dp"
android:layout_height="48dp"
android:gravity="center"
android:text="@string/shared_string_cancel"
android:textColor="@color/dashboard_general_button_text_light"
app:textAllCapsCompat="true"/>
<net.osmand.plus.widgets.ButtonEx
android:id="@+id/saveButton"
style="@style/DashboardGeneralButton"
android:height="48dp"
android:layout_height="48dp"
android:gravity="center"
android:textColor="@color/dashboard_general_button_text_light"
app:textAllCapsCompat="true"
tools:text="Save"/>
</LinearLayout>

View file

@ -2,117 +2,122 @@
<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:theme="?attr/new_app_theme">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:layout_height="wrap_content">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="14dp"
android:layout_marginRight="14dp"
android:layout_marginTop="14dp"
android:background="?attr/bg_card"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="37dp"
android:gravity="center">
android:layout_height="wrap_content"
android:layout_marginLeft="14dp"
android:layout_marginRight="14dp"
android:layout_marginTop="14dp"
android:background="?attr/bg_card"
android:orientation="vertical">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:text="@string/tag_poi_name"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="37dp"
android:gravity="center">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:text="@string/tag_poi_name"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="?attr/dashboard_divider"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/nameTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="poi name"/>
</LinearLayout>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/divider_color"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/nameTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="poi name"/>
</LinearLayout>
android:layout_height="1dp"
android:background="?attr/dashboard_divider"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_color"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="37dp"
android:gravity="center">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/amenityTagTextView"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:text="@string/tag_poi_amenity"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="?attr/dashboard_divider"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/amenityTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="landmark"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/editTagsList"
android:layout_width="match_parent"
android:layout_height="37dp"
android:gravity="center">
android:layout_height="wrap_content"
android:orientation="vertical"
android:saveEnabled="false"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/amenityTagTextView"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:text="@string/tag_poi_amenity"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular"/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/divider_color"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/amenityTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="landmark"/>
</LinearLayout>
<net.osmand.plus.widgets.ButtonEx
android:id="@+id/addTagButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginTop="16dp"
android:text="@string/add_tag"
android:textSize="@dimen/default_sub_text_size"
osmand:typeface="@string/font_roboto_medium"/>
</LinearLayout>
<LinearLayout
android:id="@+id/editTagsList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:saveEnabled="false"/>
<net.osmand.plus.widgets.ButtonEx
android:id="@+id/addTagButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginTop="16dp"
android:text="@string/add_tag"
android:textSize="@dimen/default_sub_text_size"
osmand:typeface="@string/font_roboto_medium"/>
<!--XXX due to bug in NestedScroolView-->
<Space
android:id="@+id/screenFiller"
android:layout_width="match_parent"
android:layout_height="500dp"/>
</LinearLayout>
android:layout_height="match_parent"/>
</FrameLayout>
</android.support.v4.widget.NestedScrollView>

View file

@ -4,12 +4,12 @@
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@attr/new_app_theme">
osmand:theme="?attr/new_app_theme">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/contactInfoTextView"
@ -124,10 +124,11 @@
android:textSize="@dimen/default_sub_text_size"
osmand:typeface="@string/font_roboto_medium"/>
<!--XXX due to bug in NestedScroolView-->
<!--XXX due to bug in NestedScrollView-->
<Space
android:id="@+id/screenFiller"
android:layout_width="match_parent"
android:layout_height="500dp"
tools:visibility="gone"/>
android:layout_height="match_parent"
tools:visibility="visible"/>
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>

View file

@ -1,32 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout
android:id="@+id/LinearLayout1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip">
android:orientation="horizontal">
<ImageView
android:layout_marginLeft="14dip"
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_gravity="center_vertical"
android:layout_marginLeft="24dp"
android:gravity="center"
android:layout_gravity="center_vertical" />
android:visibility="gone"/>
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="12dip"
android:layout_marginTop="11dip"
android:layout_marginBottom="11dip"
android:layout_marginLeft="12dp"
android:layout_marginTop="11dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="@string/layer_poi"
android:textSize="@dimen/default_list_text_size"
android:layout_weight="1" />
android:textSize="@dimen/default_list_text_size"/>
<LinearLayout
android:layout_width="wrap_content"
@ -37,17 +36,17 @@
android:id="@+id/icon_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:gravity="center_vertical"
android:visibility="gone"
android:focusable="false" />
android:visibility="gone"/>
<!-- android:button="@drawable/ic_btn_wocheckbox" -->
<CheckBox
android:id="@+id/check_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="6dip"
android:focusable="false" />
android:layout_marginRight="24dp"
android:focusable="false"/>
</LinearLayout>
</LinearLayout>

View file

@ -1,175 +1,184 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/context_menu_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@android:color/transparent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/context_menu_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/context_menu_shadow_view"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<View
android:id="@+id/context_menu_shadow_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
android:layout_weight="0"
android:orientation="vertical"/>
<LinearLayout
android:id="@+id/context_menu_main"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="?attr/bg_map_context_menu"
android:layout_gravity="bottom"
android:orientation="vertical">
<LinearLayout
android:id="@+id/context_menu_top_view"
android:id="@+id/context_menu_top_shadow"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_height="20dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/context_menu_icon_layout"
android:orientation="horizontal"
android:layout_width="42dp"
android:layout_height="match_parent">
<ImageView
android:id="@+id/context_menu_icon_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:scaleType="center"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:src="@drawable/ic_action_building_number"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/context_menu_line1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:text="@string/search_address_building"
android:textSize="@dimen/default_list_text_size_large"
android:textColor="?android:textColorPrimary"
android:textStyle="bold"/>
<TextView
android:id="@+id/context_menu_line2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:layout_marginTop="3dp"
android:text="@string/other_location"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"/>
</LinearLayout>
<LinearLayout
android:id="@+id/context_menu_close_btn_layout"
android:orientation="horizontal"
android:layout_width="32dp"
android:layout_height="match_parent">
<ImageView
android:id="@+id/context_menu_close_btn_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="12dp"
android:scaleType="center"
android:src="@drawable/ic_action_remove_dark"/>
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dashboard_divider"/>
<LinearLayout
android:id="@+id/context_menu_buttons"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_gravity="bottom">
android:id="@+id/context_menu_top_shadow_all"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="?attr/bg_map_context_menu"
android:orientation="vertical">
<ImageButton
android:id="@+id/context_menu_route_button"
<LinearLayout
android:id="@+id/context_menu_top_view"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:scaleType="center"
android:background="?attr/dashboard_button"
android:src="@drawable/map_directions"/>
android:layout_height="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/context_menu_icon_layout"
android:layout_width="42dp"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/context_menu_icon_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:layout_marginTop="18dp"
android:scaleType="center"
android:src="@drawable/ic_action_building_number"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="15dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/context_menu_line1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:text="@string/search_address_building"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size_large"/>
<TextView
android:id="@+id/context_menu_line2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:layout_marginTop="4dp"
android:text="@string/other_location"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"/>
</LinearLayout>
<LinearLayout
android:id="@+id/context_menu_close_btn_layout"
android:layout_width="32dp"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/context_menu_close_btn_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginTop="12dp"
android:scaleType="center"
android:src="@drawable/ic_action_remove_dark"/>
</LinearLayout>
</LinearLayout>
<View
android:layout_height="match_parent"
android:layout_width="1dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dashboard_divider"/>
<ImageButton
android:id="@+id/context_menu_fav_button"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:scaleType="center"
android:background="?attr/dashboard_button"
android:src="@drawable/ic_action_fav_dark"/>
<LinearLayout
android:id="@+id/context_menu_buttons"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="54dp">
<View
android:layout_height="match_parent"
android:layout_width="1dp"
android:background="?attr/dashboard_divider"/>
<ImageButton
android:id="@+id/context_menu_route_button"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/map_directions"/>
<ImageButton
android:id="@+id/context_menu_share_button"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:scaleType="center"
android:background="?attr/dashboard_button"
android:src="@drawable/abc_ic_menu_share_mtrl_alpha"/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="?attr/dashboard_divider"/>
<View
android:layout_height="match_parent"
android:layout_width="1dp"
android:background="?attr/dashboard_divider"/>
<ImageButton
android:id="@+id/context_menu_fav_button"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/ic_action_fav_dark"/>
<ImageButton
android:id="@+id/context_menu_more_button"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:scaleType="center"
android:background="?attr/dashboard_button"
android:src="@drawable/ic_action_core_overflow_dark"/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="?attr/dashboard_divider"/>
<ImageButton
android:id="@+id/context_menu_share_button"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/abc_ic_menu_share_mtrl_alpha"/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="?attr/dashboard_divider"/>
<ImageButton
android:id="@+id/context_menu_more_button"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="?attr/dashboard_button"
android:scaleType="center"
android:src="@drawable/ic_overflow_menu_white"/>
</LinearLayout>
</LinearLayout>
@ -177,16 +186,20 @@
android:id="@+id/context_menu_bottom_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dashboard_divider"/>
android:background="?attr/ctx_menu_info_view_bg"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/context_menu_bottom_border"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:background="?attr/ctx_menu_info_view_bg"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>

View file

@ -32,7 +32,7 @@
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_color"/>
android:background="?android:textColorSecondary"/>
</LinearLayout>
<LinearLayout
@ -59,13 +59,13 @@
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_color"/>
android:background="?android:textColorSecondary"/>
</LinearLayout>
<View
android:layout_width="16dp"
android:layout_height="1dp"
android:background="@color/divider_color"/>
android:background="?android:textColorSecondary"/>
<LinearLayout
android:layout_width="wrap_content"
@ -84,7 +84,7 @@
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_color"/>
android:background="?android:textColorSecondary"/>
</LinearLayout>
</LinearLayout>

View file

@ -74,6 +74,12 @@
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:lines="1"
android:singleLine="true"
android:scrollHorizontally="true"
android:layout_marginRight="@dimen/gpx_small_text_margin"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_sub_text_size" />

View file

@ -1065,4 +1065,7 @@
<string name="poi_military_office">Ваенкамат</string>
<string name="poi_notary">Натарыўс</string>
<string name="poi_landfill_waste_nuclear">Ядравыя адыходы</string>
<string name="poi_population">Насельніцтва</string>
</resources>

View file

@ -2088,4 +2088,5 @@
<string name="working_days">Працоўныя дні</string>
<string name="recent_places">Нядаўнія месцы</string>
<string name="favourites">Упадабанае</string>
<string name="saved_at_time">Пасьпяхова захаваны ў: %1$s</string>
</resources>

View file

@ -2113,4 +2113,9 @@ Per retornar a l\'estil habitual dels mapes d\'OsmAnd, només cal desactivar aqu
<string name="please_specify_poi_type">Especifiqueu el tipus de PDI</string>
<string name="tag_poi_amenity">instal·lació comunitària</string>
<string name="number_of_rows_in_dash">Nombre de files al tauler %1$s</string>
</resources>
<string name="poi_action_delete">Suprimeix</string>
<string name="working_days">Dies laborables</string>
<string name="recent_places">Llocs recents</string>
<string name="favourites">Favorits</string>
<string name="saved_at_time">S\'ha desat correctament a: %1$s</string>
</resources>

View file

@ -906,7 +906,7 @@
<string name="osmand_parking_pm">odpoledne</string>
<string name="osmand_parking_am">dopoledne</string>
<string name="osmand_parking_position_name">Místo parkování</string>
<string name="osmand_parking_plugin_description">Modul Parkovací místo umožňuje zapamatovat si kdy bylo auto zaparkované a kolik zůstává času, pokud je parkování časově omezené. Parkovací místo a čas parkování můžete najít na panelu aktuální mapy.\nTaké je možné přidat upomínku do kalendáře, pokud chcete být upozorněni.</string>
<string name="osmand_parking_plugin_description">Modul Parkovací místo umožňuje zapamatování si, kdy jste auto zaparkovali a v případě časově omezeného parkování také kolik času zbývá. Parkovací místo a čas parkování můžete najít na panelu aktuální mapy. Je také možné přidat upomínku do kalendáře, pokud chcete být upozorněni.</string>
<string name="osmand_parking_plugin_name">Parkovací místo</string>
<string name="context_menu_item_add_parking_point">Označit jako místo parkování</string>
<string name="context_menu_item_delete_parking_point">Smazat místo parkování</string>
@ -1994,4 +1994,17 @@ s často kladenými otázkami.</string>
<string name="no_updates_available">Nejsou dostupné žádné aktualizace</string>
<string name="traffic_warning_hazard">Nebezpečí</string>
<string name="rendering_value_boldOutline_name">Tučný obrys</string>
</resources>
<string name="favourites">Oblíbené</string>
<string name="recent_places">Nedávná místa</string>
<string name="working_days">Pracovní dny</string>
<string name="please_specify_poi_type">Vyberte prosím typ POI.</string>
<string name="add_opening_hours">Přidat otevírací dobu</string>
<string name="description">Popis</string>
<string name="contact_info">Kontaktní informace</string>
<string name="do_you_like_osmand">Máte rádi OsmAnd?</string>
<string name="we_really_care_about_your_opinion">Záleží nám na vašem názoru, ceníme si vaší zpětné vazby.</string>
<string name="rate_this_app">Ohodnoťte tuto aplikaci</string>
<string name="rate_this_app_long">Ohodnoťte prosím aplikaci OsmAnd na Google Play</string>
<string name="user_hates_app_get_feedback">Řekněte nám proč.</string>
<string name="user_hates_app_get_feedback_long">Sdělte nám prosím, co byste chtěli v této aplikaci změnit.</string>
</resources>

View file

@ -355,14 +355,14 @@
<string name="poi_chalet">Udlejningshytte</string>
<string name="poi_place_of_worship">Sted for tilbedelse</string>
<string name="poi_religion_christian">Sted for tilbedelse: Kristen</string>
<string name="poi_religion_jewish">Sted for tilbedelse: Jødisk</string>
<string name="poi_religion_muslim">Sted for tilbedelse: Muslim</string>
<string name="poi_religion_sikh">Sted for tilbedelse: Sikh</string>
<string name="poi_religion_buddhist">Sted for tilbedelse: Buddhist</string>
<string name="poi_religion_hindu">Sted for tilbedelse: Hindu</string>
<string name="poi_religion_shinto">Sted for tilbedelse: Shinto</string>
<string name="poi_religion_taoist">Sted for tilbedelse: Taoistisk</string>
<string name="poi_religion_christian">Kristendom</string>
<string name="poi_religion_jewish">Jødedom</string>
<string name="poi_religion_muslim">Islam</string>
<string name="poi_religion_sikh">Sikhisme</string>
<string name="poi_religion_buddhist">Buddhisme</string>
<string name="poi_religion_hindu">Hinduisme</string>
<string name="poi_religion_shinto">Shinto</string>
<string name="poi_religion_taoist">Taoisme</string>
<string name="poi_monastery">Kloster</string>
<string name="poi_historic_monastery">Historisk kloster</string>
<string name="poi_wayside_cross">Vejside kors</string>
@ -1080,7 +1080,7 @@
<string name="poi_financial">Finansiel kontor</string>
<string name="poi_foundation">Fondskontor</string>
<string name="poi_religion_voodoo">Voodoo</string>
<string name="poi_religion_scientologist">Scientolog</string>
<string name="poi_religion_scientologist">Scientology</string>
<string name="poi_denomination_catholic">Katolsk</string>
<string name="poi_denomination_baptist">Baptist</string>
<string name="poi_denomination_roman_catholic">Romersk-katolsk</string>
@ -1117,11 +1117,11 @@
<string name="poi_denomination_coptic_orthodox">Koptisk-ortodoks</string>
<string name="poi_denomination_mahayana">Mahayana</string>
<string name="poi_religion_unitarian_universalist">Unitarisk universalistisk</string>
<string name="poi_religion_unitarian_universalist">Unitarisk universalisme</string>
<string name="poi_religion_multifaith">Multireligiøs</string>
<string name="poi_religion_jain">Jainisme</string>
<string name="poi_religion_spiritualist">Spiritist</string>
<string name="poi_religion_bahai">Bahai</string>
<string name="poi_religion_spiritualist">Spiritisme</string>
<string name="poi_religion_bahai">Bahaism</string>
<string name="poi_religion_pagan">Hedenskab</string>
<string name="poi_religion_tenrikyo">Tenrikyo</string>
<string name="poi_religion_zoroastrian">Zarathustrisme</string>
@ -1129,10 +1129,10 @@
<string name="poi_denomination_greek_orthodox">Græsk-ortodoks</string>
<string name="poi_denomination_seventh_day_adventist">Syvende Dags Adventist</string>
<string name="poi_denomination_new_apostolic">Nyapostolsk</string>
<string name="poi_denomination_church_of_england">Den engelske kirke</string>
<string name="poi_denomination_church_of_england">Den Engelske kirke</string>
<string name="poi_denomination_shia">Shiisme</string>
<string name="poi_denomination_united_reformed">Forenede reformerte kirke</string>
<string name="poi_denomination_church_of_scotland">Den skotske kirke</string>
<string name="poi_denomination_church_of_scotland">Den Skotske kirke</string>
<string name="poi_denomination_iglesia_ni_cristo">Iglesia ni cristo</string>
<string name="poi_denomination_mennonite">Mennonit</string>
<string name="poi_denomination_assemblies_of_god">Assemblies of god</string>
@ -1175,4 +1175,54 @@
<string name="poi_bunker_silo">Plansilo</string>
<string name="poi_brownfield">Forladt industrigrund</string>
<string name="poi_greenfield">Byggemodning</string>
<string name="poi_wholesale">Engros</string>
<string name="poi_trade_building_supplies">Byggematerialer</string>
<string name="poi_trade_plumbing">VVS materialer</string>
<string name="poi_trade_wood">Træmaterialer</string>
<string name="poi_trade_agricultural_supplies">Landbrugsmaterialer</string>
<string name="poi_trade_tile">Flisematerialer</string>
<string name="poi_population">Befolkning</string>
<string name="poi_parking_multi_storey">Fleretages</string>
<string name="poi_bicycle_parking_stands">Står</string>
<string name="poi_bicycle_parking_wall_loops">Væg sløjfer</string>
<string name="poi_bicycle_parking_building">Bygning</string>
<string name="poi_bicycle_parking_shed">Skur</string>
<string name="poi_bicycle_parking_bollard">Pullert</string>
<string name="poi_bicycle_parking_informal">Uformel</string>
<string name="poi_leaf_type_broadleaved">Bredbladet</string>
<string name="poi_leaf_type_needleleaved">Nålebladet</string>
<string name="poi_leaf_type_mixed">Blandet</string>
<string name="poi_leaf_type_leafless">Bladløs</string>
<string name="poi_trees_olive">Oliven</string>
<string name="poi_trees_apple">Æble</string>
<string name="poi_trees_oil">Palmeolie</string>
<string name="poi_trees_orange">Appelsin</string>
<string name="poi_trees_almond">Mandel</string>
<string name="poi_trees_banana">Banan</string>
<string name="poi_trees_hazel">Hassel</string>
<string name="poi_trees_coconut">Kokosnød</string>
<string name="poi_trees_persimmon">Ibenholt</string>
<string name="poi_trees_cherry">Kirsebær</string>
<string name="poi_trees_walnut">Valnød</string>
<string name="poi_trees_plum">Blomme</string>
<string name="poi_trees_peach">Fersken</string>
<string name="poi_trees_tea">Te</string>
<string name="poi_trees_coca">Coca</string>
<string name="poi_trees_kiwi">Kiwi</string>
<string name="poi_trees_meadow_orchard">Frugtplantage</string>
<string name="poi_trees_nectorine">Nektarin</string>
<string name="poi_trees_mango">Mango</string>
<string name="poi_trees_rubber">Gummitræ</string>
<string name="poi_trees_date">Dadel</string>
<string name="poi_trees_coffea">Kaffe</string>
<string name="poi_trees_pomegranate">Granatæble</string>
<string name="poi_parking_underground">Kældet</string>
<string name="poi_bicycle_parking_rack">Reol</string>
</resources>

View file

@ -2128,4 +2128,7 @@
<string name="recent_places">Seneste steder</string>
<string name="favourites">Favoritter</string>
<string name="poi_action_delete">slet</string>
</resources>
<string name="saved_at_time">Gemt korrekt: %1$s</string>
<string name="poi_deleted_localy">IP vil blive slettet, når ændringer overføres</string>
<string name="show_gpx">Vis GPX</string>
</resources>

View file

@ -1938,7 +1938,7 @@ Afghanistan, Ägypten, Albanien, Algerien, Andorra, Angola, Anguilla, Antigua an
<string name="download_additional_maps">Fehlende Karten herunterladen: %1$s (%2$d MB)?</string>
<string name="shared_string_more">Mehr…</string>
<string name="osmo_specify_tracker_id">Bitte ID eingeben</string>
<string name="home">Ausgangsposition</string>
<string name="home">Übersicht</string>
<string name="rendering_attr_publicTransportMode_name">Bus-, Oberleitungsbus-, Sammeltaxi-Linien</string>
<string name="record_plugin_name">Streckenaufzeichnung</string>
<string name="int_hour">h</string>

View file

@ -68,7 +68,7 @@
<string name="poi_baby_goods">Artículos para bebés</string>
<string name="poi_bag">Venta de bolsos</string>
<string name="poi_bathroom_furnishing">Muebles de baño</string>
<string name="poi_bed">Muebles de dormitorio</string>
<string name="poi_bed">Colchonería</string>
<string name="poi_boutique">Boutique de moda</string>
<string name="poi_carpet">Alfombras</string>
<string name="poi_charity">Negocio benéfico</string>
@ -507,14 +507,14 @@
<string name="poi_hunting_lodge">Pabellón de caza</string>
<string name="poi_place_of_worship">Lugar de culto</string>
<string name="poi_religion_christian">Lugar de culto: cristiano</string>
<string name="poi_religion_jewish">Lugar de culto: judio</string>
<string name="poi_religion_muslim">Lugar de culto: musulmán</string>
<string name="poi_religion_sikh">Lugar de culto: sijista</string>
<string name="poi_religion_buddhist">Lugar de culto: budista</string>
<string name="poi_religion_hindu">Lugar de culto: hindú</string>
<string name="poi_religion_shinto">Lugar de culto: sintoísta</string>
<string name="poi_religion_taoist">Lugar de culto: taoísta</string>
<string name="poi_religion_christian">Cristiandad</string>
<string name="poi_religion_jewish">Judaísmo</string>
<string name="poi_religion_muslim">Islámismo</string>
<string name="poi_religion_sikh">Sijismo</string>
<string name="poi_religion_buddhist">Budismo</string>
<string name="poi_religion_hindu">Hinduismo</string>
<string name="poi_religion_shinto">Sintoísmo</string>
<string name="poi_religion_taoist">Taoísmo</string>
<string name="poi_internet_access_wlan">Internet inalámbrico</string>
<string name="poi_internet_access_terminal">PC con Internet</string>
@ -862,7 +862,7 @@
<string name="poi_garden_furniture">Almacén de jardinería</string>
<string name="poi_leather">Marroquinería</string>
<string name="poi_tyres">Neumáticos</string>
<string name="poi_watches">Relojería (watches)</string>
<string name="poi_watches">Relojería</string>
<string name="poi_games">Juegos</string>
<string name="poi_model">Modelos a escala</string>
<string name="poi_trophy">Trofeos, premios</string>
@ -1040,7 +1040,7 @@
<string name="poi_recycling_cardboard">Cartón</string>
<string name="poi_recycling_hardcore">Escombros</string>
<string name="poi_recycling_chipboard">Conglomerado</string>
<string name="poi_recycling_chipboard">Cartón prensado</string>
<string name="poi_mill_pond">Laguna de molino</string>
<string name="poi_twitter">Twitter</string>
<string name="poi_skype">Skype</string>
@ -1062,15 +1062,15 @@
<string name="poi_military_office">Oficina militar</string>
<string name="poi_religion_voodoo">Vudú</string>
<string name="poi_religion_unitarian_universalist">Unitariano universalista</string>
<string name="poi_religion_unitarian_universalist">Unitarianismo universal</string>
<string name="poi_religion_multifaith">Multireligioso</string>
<string name="poi_religion_jain">Jainista</string>
<string name="poi_religion_spiritualist">Espiritualista</string>
<string name="poi_religion_bahai">Bahaísta</string>
<string name="poi_religion_scientologist">Cienciologísta</string>
<string name="poi_religion_pagan">Pagano</string>
<string name="poi_religion_jain">Jainismo</string>
<string name="poi_religion_spiritualist">Espiritualismo</string>
<string name="poi_religion_bahai">Bahaísmo</string>
<string name="poi_religion_scientologist">Cienciologísmo</string>
<string name="poi_religion_pagan">Paganismo</string>
<string name="poi_religion_tenrikyo">Tenrikyō</string>
<string name="poi_religion_zoroastrian">Zoroástrica</string>
<string name="poi_religion_zoroastrian">Zoroástrismo</string>
<string name="poi_denomination_catholic">Católica</string>
<string name="poi_denomination_baptist">Bautista</string>
@ -1128,7 +1128,7 @@
<string name="poi_denomination_united_reformed">Reformada unida</string>
<string name="poi_denomination_reformed">Reformado</string>
<string name="poi_denomination_united">Unido</string>
<string name="poi_denomination_quaker">cuáquero</string>
<string name="poi_denomination_quaker">Cuáquero</string>
<string name="poi_denomination_shaktism">Shaktismo</string>
<string name="poi_denomination_uniting">Uniendo</string>
<string name="poi_denomination_wesleyan">Wesleyan</string>
@ -1157,4 +1157,33 @@
<string name="poi_content_slurry">Mezcla (contenido)</string>
<string name="poi_brownfield">Terreno abandonado</string>
<string name="poi_greenfield">Suelo urbanizable</string>
<string name="poi_wholesale">Venta mayorista</string>
<string name="poi_trade_building_supplies">Materiales de construcción</string>
<string name="poi_trade_plumbing">Suministros de plomería</string>
<string name="poi_trade_wood">Venta de madera</string>
<string name="poi_trade_agricultural_supplies">Suministros agrícolas</string>
<string name="poi_trade_tile">Venta de azulejos</string>
<string name="poi_population">Población</string>
<string name="poi_parking_underground">Subterráneo</string>
<string name="poi_parking_multi_storey">Varios pisos</string>
<string name="poi_bicycle_parking_stands">Soporte</string>
<string name="poi_bicycle_parking_wall_loops">Soporte de pared</string>
<string name="poi_bicycle_parking_informal">Informal</string>
<string name="poi_leaf_type_broadleaved">Hoja ancha</string>
<string name="poi_leaf_type_needleleaved">Hoja acicular</string>
<string name="poi_leaf_type_mixed">Mixto</string>
<string name="poi_leaf_type_leafless">Sin hojas</string>
<string name="poi_trees_olive">Olivo</string>
<string name="poi_trees_apple">Manzano</string>
<string name="poi_trees_oil">Aceite de palma</string>
<string name="poi_trees_orange">Naranjo</string>
<string name="poi_trees_almond">Almendro</string>
<string name="poi_trees_banana">Banano</string>
<string name="poi_trees_hazel">Avellanos</string>
<string name="poi_trees_coconut">Cocotero</string>
</resources>

View file

@ -2048,4 +2048,7 @@
<string name="recent_places">Lugares recientes</string>
<string name="favourites">Favoritos</string>
<string name="poi_action_delete">borrar</string>
</resources>
<string name="saved_at_time">Guardado exitosamente como: %1$s</string>
<string name="poi_deleted_localy">El PDI se eliminará una vez subido los cambios</string>
<string name="show_gpx">Mostrar GPX</string>
</resources>

View file

@ -290,7 +290,7 @@
<string name="poi_chalet">Chalé</string>
<string name="poi_apartment">Apartamento</string>
<string name="poi_place_of_worship">Lugar de culto</string>
<string name="poi_religion_christian">Lugar de culto: cristiano</string>
<string name="poi_religion_christian">Cristianismo</string>
<string name="poi_internet_access_wlan">Acceso a Internet: inalámbrico</string>
<string name="poi_internet_access_wired">Acceso a Internet: cableado</string>
<string name="poi_internet_access_public">Acceso a Internet: público</string>
@ -559,12 +559,12 @@
<string name="poi_lodging">Alojamiento</string>
<string name="poi_wilderness_hut">Cabaña</string>
<string name="poi_religion_muslim">Lugar de culto: musulmán</string>
<string name="poi_religion_sikh">Lugar de culto: sijista</string>
<string name="poi_religion_buddhist">Lugar de culto: budista</string>
<string name="poi_religion_hindu">Lugar de culto: hindú</string>
<string name="poi_religion_shinto">Lugar de culto: sintoísta</string>
<string name="poi_religion_taoist">Lugar de culto: taoísta</string>
<string name="poi_religion_muslim">Islamismo</string>
<string name="poi_religion_sikh">Sijismo</string>
<string name="poi_religion_buddhist">Budismo</string>
<string name="poi_religion_hindu">Hinduismo</string>
<string name="poi_religion_shinto">Sintoísmo</string>
<string name="poi_religion_taoist">Taoísmo</string>
<string name="poi_wayside_cross">Crucero</string>
<string name="poi_wayside_shrine">Ermita en el camino</string>
@ -692,7 +692,7 @@
<string name="poi_attraction_amusement_ride">Atracción de feria</string>
<string name="poi_attraction_big_wheel">Noria</string>
<string name="poi_attraction_swing_carousel">Carrusel de oscilación</string>
<string name="poi_religion_jewish">Lugar de culto: judio</string>
<string name="poi_religion_jewish">Judaísmo</string>
<string name="poi_internet_access_service">Acceso a Internet: servicio</string>
<string name="poi_spring">Manantial</string>
@ -912,7 +912,7 @@
<string name="poi_enforcement_check">Control</string>
<string name="poi_enforcement_toll">Control de peaje</string>
<string name="poi_kissing_gate">Portilla giratoria</string>
<string name="poi_kissing_gate">Portilla en V</string>
<string name="poi_sally_port">Portón de muralla</string>
<string name="poi_ncn_ref">Red de nodos ciclista nacional</string>
<string name="poi_rcn_ref">Red de nodos ciclista regional</string>
@ -1065,15 +1065,15 @@
<string name="poi_military_office">Oficina militar</string>
<string name="poi_religion_voodoo">Vudú</string>
<string name="poi_religion_unitarian_universalist">Unitariano universalista</string>
<string name="poi_religion_unitarian_universalist">Unitarismo universal</string>
<string name="poi_religion_multifaith">Multireligioso</string>
<string name="poi_religion_jain">Jainista</string>
<string name="poi_religion_spiritualist">Espiritualista</string>
<string name="poi_religion_bahai">Bahaísta</string>
<string name="poi_religion_scientologist">Cienciologísta</string>
<string name="poi_religion_pagan">Pagano</string>
<string name="poi_religion_jain">Jainismo</string>
<string name="poi_religion_spiritualist">Espiritismo</string>
<string name="poi_religion_bahai">Bahaísmo</string>
<string name="poi_religion_scientologist">Cienciologísmo</string>
<string name="poi_religion_pagan">Paganismo</string>
<string name="poi_religion_tenrikyo">Tenrikyō</string>
<string name="poi_religion_zoroastrian">Zoroástrica</string>
<string name="poi_religion_zoroastrian">Zoroastrismo</string>
<string name="poi_denomination_catholic">Católica</string>
<string name="poi_denomination_baptist">Bautista</string>
@ -1111,7 +1111,7 @@
<string name="poi_denomination_congregational">Congregacional</string>
<string name="poi_denomination_old_believers">Antiguos creyentes</string>
<string name="poi_denomination_serbian_orthodox">Ortodoxa Serbia</string>
<string name="poi_denomination_spiritist">Espírita</string>
<string name="poi_denomination_spiritist">Espiritista</string>
<string name="poi_denomination_armenian_apostolic">Apostólico armenio</string>
<string name="poi_denomination_dutch_reformed">Holandés reformado</string>
<string name="poi_denomination_apostolic">Apostólica</string>
@ -1151,7 +1151,7 @@
<string name="poi_content_sewage">Aguas residuales (contenido)</string>
<string name="poi_content_gas">Gas (contenido)</string>
<string name="poi_content_biomass">Biomasa (contenido)</string>
<string name="poi_content_wastewater">Aguas residuales (contenido)</string>
<string name="poi_content_wastewater">Agua residual (contenido)</string>
<string name="poi_content_crop">Cultivo (contenido)</string>
<string name="poi_content_fodder">Forraje (contenido)</string>
<string name="poi_content_beer">Cerveza (contenido)</string>
@ -1160,4 +1160,44 @@
<string name="poi_brownfield">Terreno abandonado</string>
<string name="poi_greenfield">Suelo urbanizable</string>
<string name="poi_wholesale">Venta mayorista</string>
<string name="poi_trade_building_supplies">Materiales de construcción</string>
<string name="poi_trade_plumbing">Materiales de fontanería/plomería</string>
<string name="poi_trade_wood">Suministros de madera</string>
<string name="poi_trade_agricultural_supplies">Insumos agrícolas</string>
<string name="poi_trade_tile">Azulejos</string>
<string name="poi_population">Población</string>
<string name="poi_parking_underground">Subterráneo</string>
<string name="poi_parking_multi_storey">Varios pisos</string>
<string name="poi_bicycle_parking_stands">Soportes</string>
<string name="poi_leaf_type_broadleaved">Hoja ancha</string>
<string name="poi_leaf_type_needleleaved">Hoja acicular</string>
<string name="poi_leaf_type_mixed">Mixto</string>
<string name="poi_leaf_type_leafless">Sin hojas</string>
<string name="poi_trees_olive">Olivo</string>
<string name="poi_trees_apple">Manzano</string>
<string name="poi_trees_oil">Aceite de palma</string>
<string name="poi_trees_orange">Naranjo</string>
<string name="poi_trees_almond">Almendro</string>
<string name="poi_trees_banana">Banano / Plátano</string>
<string name="poi_trees_hazel">Avellano</string>
<string name="poi_trees_coconut">Cocotéro</string>
<string name="poi_trees_persimmon">Caqui</string>
<string name="poi_trees_cherry">Cerezo</string>
<string name="poi_trees_walnut">Nogal</string>
<string name="poi_trees_plum">Ciruelo</string>
<string name="poi_trees_peach">Melocotón</string>
<string name="poi_trees_tea"></string>
<string name="poi_trees_coca">Coca</string>
<string name="poi_trees_kiwi">Kiwi</string>
<string name="poi_trees_meadow_orchard">Prado con huertos</string>
<string name="poi_trees_mango">Mango</string>
<string name="poi_trees_date">Fecha</string>
<string name="poi_trees_coffea">Café</string>
<string name="poi_trees_pomegranate">Granada</string>
</resources>

View file

@ -2161,7 +2161,7 @@
<string name="shared_string_undo">Deshacer</string>
<string name="shared_string_skip">Omitir</string>
<string name="app_name_osmand">OsmAnd</string>
<string name="offline_maps_and_navigation">Mapas y navegación fuera de línea</string>
<string name="offline_maps_and_navigation">Mapas y navegación\nfuera de línea</string>
<string name="commit_poi">Enviar PDI</string>
<string name="routing_attr_avoid_shuttle_train_name">Evitar tren de enlace</string>
<string name="routing_attr_avoid_shuttle_train_description">Evite tomar trenes de enlace</string>
@ -2185,4 +2185,8 @@
<string name="working_days">Días laborales</string>
<string name="recent_places">Lugares recientes</string>
<string name="favourites">Favoritos</string>
<string name="poi_action_delete">borrar</string>
<string name="saved_at_time">Guardado exitosamente en: %1$s</string>
<string name="poi_deleted_localy">El PDI se eliminará una vez subido los cambios</string>
<string name="show_gpx">Mostrar GPX</string>
</resources>

View file

@ -434,8 +434,8 @@
<string name="install_selected_build">Telepíted az OsmAnd alkalmazást - {0} innen: {1} {2} MB?</string>
<string name="loading_builds_failed">Az OsmAnd verziók listájának letöltése nem sikerült</string>
<string name="loading_builds">OsmAnd összeállítások töltése…</string>
<string name="select_build_to_install">A telepítéshez válassz egy OsmAnd buildet</string>
<string name="contribution_activity">Telepítési verzió</string>
<string name="select_build_to_install">Válassz egy OsmAnd buildet</string>
<string name="contribution_activity">Verzió telepítése</string>
<string name="gps_status_app_not_found">A GPS-állapot alkalmazás nincs telepítve. Megkeresi a piactéren?</string>
<string name="voice_is_not_available_msg">A beszéd alapú navigáció nem érhető el. A Beállítások → \'Általános\' → \'Hangutasítás\' menüben kiválaszthatsz, vagy letölthetsz hangcsomagokat.</string>
<string name="voice_is_not_available_title">Nincs kiválasztva hang adat</string>
@ -1186,7 +1186,7 @@
\n\t* Pebble óra támogatás "
</string>
<string name="street_name">Utca</string>
<string name="street_name">Utcanév</string>
<string name="hno">Házszám</string>
<string name="monitoring_settings">Útvonalrögzítés</string>
<string name="monitoring_settings_descr">Az útvonalaid felvételének beállításai</string>
@ -2044,4 +2044,24 @@
<string name="next_proceed">Tovább</string>
<string name="dahboard_options_dialog_title">Kezdőlap beállításai</string>
<string name="traffic_warning_hazard">Veszély</string>
</resources>
<string name="poi_action_delete">törlés</string>
<string name="shared_string_undo">VISSZAVON</string>
<string name="commit_poi">POI beküldése</string>
<string name="tab_title_basic">Alap</string>
<string name="tab_title_advanced">Haladó</string>
<string name="building_number">Házszám</string>
<string name="opening_at">Nyitás</string>
<string name="closing_at">Zárás</string>
<string name="tag_poi_name">név</string>
<string name="tag_poi_amenity">szolgáltatás</string>
<string name="contact_info">Elérhetőségek</string>
<string name="description">Leírás</string>
<string name="add_opening_hours">Nyitva tartás hozzáadása</string>
<string name="poi_dialog_poi_type">POI típus</string>
<string name="number_of_rows_in_dash">Sorok száma a kezdőlapon %1$s</string>
<string name="please_specify_poi_type">Kérlek add meg a POI típusát.</string>
<string name="working_days">Munkanapok</string>
<string name="recent_places">Gyakori helyek</string>
<string name="favourites">Kedvencek</string>
<string name="saved_at_time">Sikeresen mentve ekkor: %1$s</string>
</resources>

View file

@ -517,14 +517,14 @@
<string name="poi_hunting_lodge">Pavilhão de caça</string>
<string name="poi_place_of_worship">Lugar de prática religiosa</string>
<string name="poi_religion_christian">Lugar de culto: cristão</string>
<string name="poi_religion_jewish">Lugar de culto: judaico</string>
<string name="poi_religion_muslim">Lugar de culto: muçulmano</string>
<string name="poi_religion_sikh">Lugar de culto: siquista</string>
<string name="poi_religion_buddhist">Lugar de culto: budista</string>
<string name="poi_religion_hindu">Lugar de culto: hindu</string>
<string name="poi_religion_shinto">Lugar de culto: xintoísta</string>
<string name="poi_religion_taoist">Lugar de culto: taoísta</string>
<string name="poi_religion_christian">Cristianismo</string>
<string name="poi_religion_jewish">Judaísmo</string>
<string name="poi_religion_muslim">Islamismo</string>
<string name="poi_religion_sikh">Sikhismo</string>
<string name="poi_religion_buddhist">Budismo</string>
<string name="poi_religion_hindu">Hinduísmo</string>
<string name="poi_religion_shinto">Xintoísmo</string>
<string name="poi_religion_taoist">Taoísmo</string>
<string name="poi_internet_access_wlan">Acesso à Internet: wlan</string>
<string name="poi_internet_access_terminal">Acesso à Internet: terminal</string>
@ -1064,18 +1064,18 @@
<string name="poi_religion_voodoo">Voodoo</string>
<string name="poi_religion_multifaith">Multirreligiosa</string>
<string name="poi_religion_spiritualist">Espiritualista</string>
<string name="poi_religion_bahai">Bahai</string>
<string name="poi_religion_scientologist">Cientologista</string>
<string name="poi_religion_pagan">Pagão</string>
<string name="poi_religion_spiritualist">Espiritualismo</string>
<string name="poi_religion_bahai">Bahaísmo</string>
<string name="poi_religion_scientologist">Cientologismo</string>
<string name="poi_religion_pagan">Paganismo</string>
<string name="poi_religion_zoroastrian">Zoroastrismo</string>
<string name="poi_denomination_catholic">Católica</string>
<string name="poi_denomination_baptist">Batista</string>
<string name="poi_denomination_roman_catholic">Católica romana</string>
<string name="poi_denomination_orthodox">Ortodoxo</string>
<string name="poi_religion_unitarian_universalist">Unitário-Universalista</string>
<string name="poi_religion_jain">Jainista</string>
<string name="poi_religion_unitarian_universalist">Unitário-Universalismo</string>
<string name="poi_religion_jain">Jainismo</string>
<string name="poi_religion_tenrikyo">Tenrikyo</string>
<string name="poi_denomination_lutheran">Luterana</string>
<string name="poi_denomination_sunni">Sunita</string>
@ -1158,4 +1158,14 @@
<string name="poi_content_salt">Sal (conteúdo)</string>
<string name="poi_content_grain">Grão (conteúdo)</string>
<string name="poi_wholesale">Atacado</string>
<string name="poi_trade_building_supplies">Materiais de construção</string>
<string name="poi_trade_plumbing">Material de canalização</string>
<string name="poi_trade_agricultural_supplies">Suprimentos agrícolas</string>
<string name="poi_trade_wood">Suprimentos de madeira</string>
<string name="poi_trade_tile">Suprimentos de telha</string>
<string name="poi_population">População</string>
</resources>

View file

@ -1817,4 +1817,7 @@
<string name="recent_places">Locais recentes</string>
<string name="favourites">Favoritos</string>
<string name="poi_action_delete">apagar</string>
</resources>
<string name="saved_at_time">Salvo com sucesso em: %1$s</string>
<string name="poi_deleted_localy">POI será apagado quando você enviar suas alterações</string>
<string name="show_gpx">Mostrar GPX</string>
</resources>

View file

@ -1677,4 +1677,38 @@
<string name="rendering_value_default13_name">Implicit(13)</string>
<string name="rendering_value_defaultTranslucentCyan_name">Implicit(cyan transparent)</string>
<string name="rendering_attr_currentTrackColor_name">Culoare GPX</string>
<string name="plugin_settings">Pluginuri</string>
<string name="routing_attr_avoid_shuttle_train_name">Evită transfer tren</string>
<string name="traffic_warning_hazard">Pericol</string>
<string name="routing_attr_avoid_shuttle_train_description">Evită transfer tren</string>
<string name="no_updates_available">Nu sunt disponibile update-uri.</string>
<string name="rendering_attr_currentTrackWidth_name">Lățime GPX</string>
<string name="download_live_updates">Update-uri in timp real</string>
<string name="rendering_value_boldOutline_name">Bold contur</string>
<string name="av_locations">Locații</string>
<string name="av_locations_descr">Fișier GPX cu notări locații</string>
<string name="rendering_value_red_name">Roșu</string>
<string name="rendering_value_translucent_red_name">Roșu transparent</string>
<string name="rendering_value_translucent_orange_name">Portocaliu transparent</string>
<string name="rendering_value_yellow_name">Galben</string>
<string name="rendering_value_translucent_yellow_name">Galben transparent</string>
<string name="rendering_value_lightgreen_name">Verde deschis</string>
<string name="rendering_value_translucent_lightgreen_name">Verde deschis transparent</string>
<string name="rendering_value_green_name">Verde</string>
<string name="rendering_value_translucent_green_name">Verde transparent</string>
<string name="rendering_value_lightblue_name">Albastru deschis</string>
<string name="rendering_value_translucent_lightblue_name">Albastru deschis transparent</string>
<string name="rendering_value_blue_name">Albastru</string>
<string name="rendering_value_translucent_blue_name">Albastru transparent</string>
<string name="rendering_value_purple_name">Violet</string>
<string name="rendering_value_translucent_purple_name">Violet transparent</string>
<string name="restart_is_required">Pentru a aplica modificările, este nevoie să restartați aplicația.</string>
<string name="light_theme">Deschisă</string>
<string name="dark_theme">Închisă</string>
<string name="lang_pms">Piemontez</string>
<string name="lang_bn">Bengali</string>
<string name="lang_sh">Sărbă-Croată</string>
<string name="archive_wikipedia_data">Aveți descărcate informații vechi din Wikipedia, incompatibile. Doriți să le arhivați?</string>
<string name="download_wikipedia_files">Doriți să descărcați informații adiționale din Wikipedia (%1$s MB) ?</string>
<string name="gps_network_not_enabled">Serviciul de localizare este oprit. Doriți să îl activați?</string>
</resources>

View file

@ -437,14 +437,14 @@
<string name="poi_chalet">Шале</string>
<string name="poi_place_of_worship">Место поклонения</string>
<string name="poi_religion_christian">Храм, церковь (часовня)</string>
<string name="poi_religion_jewish">Синагога</string>
<string name="poi_religion_muslim">Мечеть</string>
<string name="poi_religion_sikh">Место поклонения: сикхизм</string>
<string name="poi_religion_buddhist">Место поклонения: буддизм</string>
<string name="poi_religion_hindu">Место поклонения: индуизм</string>
<string name="poi_religion_shinto">Место поклонения: синтоизм</string>
<string name="poi_religion_taoist">Место поклонения: даосизм</string>
<string name="poi_religion_christian">Христианство</string>
<string name="poi_religion_jewish">Иудаизм</string>
<string name="poi_religion_muslim">Мусульманство</string>
<string name="poi_religion_sikh">Сикхизм</string>
<string name="poi_religion_buddhist">Буддизм</string>
<string name="poi_religion_hindu">Индуизм</string>
<string name="poi_religion_shinto">Синтоизм</string>
<string name="poi_religion_taoist">Даосизм</string>
<string name="poi_monastery">Монастырь</string>
<string name="poi_historic_monastery">Исторический монастырь</string>
<string name="poi_wayside_cross">Придорожный крест</string>
@ -662,6 +662,7 @@
<string name="poi_town">Город (небольшой)</string>
<string name="poi_village">Деревня</string>
<string name="poi_hamlet">Деревня (небольшая)</string>
<string name="poi_suburb">Район</string>
<string name="poi_isolated_dwelling">Хутор</string>
<string name="poi_locality">Урочище</string>
@ -851,6 +852,21 @@
<string name="poi_crossing_uncontrolled">Нерегулируемый</string>
<string name="poi_crossing_unmarked">Неразмеченный</string>
<string name="poi_population">Население</string>
<string name="poi_start_date">Дата начала постройки</string>
<string name="poi_wheelchair">Доступно для инвалидных кресел</string>
<string name="poi_wholesale">Опт</string>
<string name="poi_parking_underground">Подземная</string>
<string name="poi_parking_multi_storey">Многоэтажная</string>
<string name="poi_bicycle_parking_stands">Стойка</string>
<string name="poi_bicycle_parking_wall_loops">Крепление только для переднего колеса</string>
<string name="poi_bicycle_parking_rack">Рама</string>
<string name="poi_bicycle_parking_building">Специальное здание</string>
<string name="poi_bicycle_parking_shed">Навес</string>
<string name="poi_bicycle_parking_bollard">Столбик с креплением</string>
<string name="poi_bicycle_parking_informal">Неофициальная</string>
<string name="poi_access_private">Частный доступ</string>
<string name="poi_access_no">Нет доступа</string>
<string name="poi_access_destination">Доступ: пункт назначения</string>
@ -859,4 +875,71 @@
<string name="poi_access_delivery">Доступ только для доставки</string>
<string name="poi_access_agricultural">Доступ только для с/х техники</string>
<string name="poi_denomination_catholic">Католицизм</string>
<string name="poi_denomination_baptist">Баптизм</string>
<string name="poi_denomination_roman_catholic">Римский католицизм</string>
<string name="poi_denomination_orthodox">Православие</string>
<string name="poi_denomination_lutheran">Лютеранство</string>
<string name="poi_denomination_sunni">Суннизм</string>
<string name="poi_denomination_protestant">Протестантизм</string>
<string name="poi_denomination_methodist">Методизм</string>
<string name="poi_denomination_anglican">Англиканство</string>
<string name="poi_denomination_presbyterian">Пресвитерианство</string>
<string name="poi_denomination_evangelical">Евангелизм</string>
<string name="poi_denomination_russian_orthodox">Русское православие</string>
<string name="poi_denomination_pentecostal">Пятидесятничество</string>
<string name="poi_denomination_mormon">Мормонизм</string>
<string name="poi_denomination_jehovahs_witness">Свидетели Иеговы</string>
<string name="poi_denomination_greek_orthodox">Греческое православие</string>
<string name="poi_denomination_reformed">Кальвинизм</string>
<string name="poi_denomination_seventh_day_adventist">Адвентисты седьмого дня</string>
<string name="poi_denomination_new_apostolic">Новоапостольская церковь</string>
<string name="poi_denomination_church_of_england">Церковь Англии</string>
<string name="poi_denomination_episcopal">Епископальная церковь</string>
<string name="poi_denomination_shia">Шиизм</string>
<string name="poi_denomination_united">Объединённая церковь</string>
<string name="poi_denomination_greek_catholic">Греческий католицизм</string>
<string name="poi_denomination_tibetan">Тибетский буддизм</string>
<string name="poi_denomination_church_of_scotland">Церковь Шотландии</string>
<string name="poi_denomination_salvation_army">Армия спасения</string>
<string name="poi_denomination_iglesia_ni_cristo">Церковь Христа</string>
<string name="poi_denomination_mennonite">Меннонитство</string>
<string name="poi_denomination_quaker">Квакерство</string>
<string name="poi_denomination_bulgarian_orthodox">Болгарское православие</string>
<string name="poi_denomination_assemblies_of_god">Ассамблеи Бога</string>
<string name="poi_denomination_nondenominational">Без деноминации</string>
<string name="poi_denomination_adventist">Адвентисты</string>
<string name="poi_denomination_old_believers">Старообрядчество</string>
<string name="poi_denomination_serbian_orthodox">Сербское православие</string>
<string name="poi_denomination_spiritist">Спиритизм</string>
<string name="poi_denomination_armenian_apostolic">Армянская апостольская церковь</string>
<string name="poi_leaf_type_broadleaved">Широколиственная растительность</string>
<string name="poi_leaf_type_needleleaved">Хвойная растительность</string>
<string name="poi_leaf_type_mixed">Смешанного типа</string>
<string name="poi_leaf_type_leafless">Безлистная растительность</string>
<string name="poi_trees_olive">Оливка</string>
<string name="poi_trees_apple">Яблоко</string>
<string name="poi_trees_oil">Пальмовое масло</string>
<string name="poi_trees_orange">Апельсин</string>
<string name="poi_trees_almond">Миндаль</string>
<string name="poi_trees_banana">Банан</string>
<string name="poi_trees_hazel">Лесной орех</string>
<string name="poi_trees_coconut">Кокос</string>
<string name="poi_trees_persimmon">Хурма</string>
<string name="poi_trees_cherry">Вишня</string>
<string name="poi_trees_walnut">Грецкий орех</string>
<string name="poi_trees_plum">Слива</string>
<string name="poi_trees_peach">Персик</string>
<string name="poi_trees_tea">Чай</string>
<string name="poi_trees_coca">Кока</string>
<string name="poi_trees_kiwi">Киви</string>
<string name="poi_trees_meadow_orchard">Плодовый сад</string>
<string name="poi_trees_nectorine">Нектарин</string>
<string name="poi_trees_mango">Манго</string>
<string name="poi_trees_rubber">Каучук</string>
<string name="poi_trees_date">Финики</string>
<string name="poi_trees_coffea">Кофe</string>
<string name="poi_trees_pomegranate">Гранат</string>
</resources>

View file

@ -843,7 +843,7 @@
<string name="poi_error_unexpected_template">Произошла неожиданная ошибка при выполнении действия {0}.</string>
<string name="poi_error_io_error_template">Произошла ошибка ввода/вывода при выполнении действия {0}.</string>
<string name="poi_error_info_not_loaded">Произошла ошибка при загрузке информации о POI</string>
<string name="poi_dialog_name">Имя</string>
<string name="poi_dialog_name">Название</string>
<string name="poi_dialog_opening_hours">Время работы</string>
<string name="poi_dialog_comment">Комментарий</string>
<string name="poi_dialog_comment_default">Изменение POI</string>
@ -2090,4 +2090,5 @@
<string name="rendering_value_boldOutline_name">Жирный контур</string>
<string name="working_days">Рабочие дни</string>
<string name="favourites">Избранное</string>
<string name="saved_at_time">Успешно сохранён в: %1$s</string>
</resources>

View file

@ -1994,4 +1994,5 @@
<string name="working_days">Arbetsdagar</string>
<string name="recent_places">Nyliga platser</string>
<string name="poi_action_delete">ta bort</string>
</resources>
<string name="saved_at_time">Sparades utan problem kl. %1$s</string>
</resources>

View file

@ -508,14 +508,14 @@
<string name="poi_hunting_lodge">狩獵小屋</string>
<string name="poi_place_of_worship">宗教場所</string>
<string name="poi_religion_christian">宗教場所:基督教</string>
<string name="poi_religion_jewish">宗教場所:猶太教</string>
<string name="poi_religion_muslim">宗教場所:回教</string>
<string name="poi_religion_sikh">宗教場所:錫克教</string>
<string name="poi_religion_buddhist">宗教場所:佛教</string>
<string name="poi_religion_hindu">宗教場所:印度教</string>
<string name="poi_religion_shinto">宗教場所:日本神道教</string>
<string name="poi_religion_taoist">宗教場所:道教</string>
<string name="poi_religion_christian">基督教</string>
<string name="poi_religion_jewish">猶太教</string>
<string name="poi_religion_muslim">回教</string>
<string name="poi_religion_sikh">錫克教</string>
<string name="poi_religion_buddhist">佛教</string>
<string name="poi_religion_hindu">印度教</string>
<string name="poi_religion_shinto">神道教</string>
<string name="poi_religion_taoist">道教</string>
<string name="poi_internet_access_wlan">網際網路存取:無線網路</string>
<string name="poi_internet_access_terminal">網際網路存取:終端</string>
@ -940,7 +940,7 @@
<string name="poi_access_permissive">容許通行</string>
<string name="poi_access_customers">顧客通行</string>
<string name="poi_access_delivery">交貨通行</string>
<string name="poi_access_agricultural">通路</string>
<string name="poi_access_agricultural">通路</string>
<string name="poi_monitoring_station">監測站</string>
<string name="poi_capital">首都</string>
@ -1156,4 +1156,33 @@
<string name="poi_content_salt">鹽 (內容)</string>
<string name="poi_content_grain">榖物 (內容)</string>
<string name="poi_wholesale">批發商</string>
<string name="poi_trade_building_supplies">建材供應商</string>
<string name="poi_trade_plumbing">配管供應商</string>
<string name="poi_trade_wood">木材供應商</string>
<string name="poi_trade_agricultural_supplies">農藝供應商</string>
<string name="poi_trade_tile">磚瓦供應商</string>
<string name="poi_population">人口數</string>
<string name="poi_parking_underground">地下</string>
<string name="poi_parking_multi_storey">多層</string>
<string name="poi_bicycle_parking_stands">立台</string>
<string name="poi_bicycle_parking_wall_loops">壁掛架</string>
<string name="poi_bicycle_parking_rack">擱物架</string>
<string name="poi_bicycle_parking_building">建築物</string>
<string name="poi_bicycle_parking_shed">車棚</string>
<string name="poi_bicycle_parking_bollard">系船柱</string>
<string name="poi_bicycle_parking_informal">非正式的</string>
<string name="poi_leaf_type_broadleaved">闊葉樹</string>
<string name="poi_leaf_type_needleleaved">針葉樹</string>
<string name="poi_leaf_type_mixed">混合林</string>
<string name="poi_leaf_type_leafless">無葉植物</string>
<string name="poi_trees_olive">橄欖樹</string>
<string name="poi_trees_apple">蘋果樹</string>
<string name="poi_trees_oil">棕櫚油</string>
</resources>

View file

@ -2105,4 +2105,5 @@
<string name="working_days">工作日</string>
<string name="recent_places">最近的地點</string>
<string name="favourites">我的最愛</string>
<string name="saved_at_time">已順利的儲存於:%1$s</string>
</resources>

View file

@ -12,6 +12,7 @@
<attr name="bg_color" format="reference" />
<attr name="bg_card" format="reference" />
<attr name="bg_map_context_menu" format="reference" />
<attr name="ctx_menu_info_view_bg" format="reference" />
<attr name="dashboard_divider" format="reference" />
<attr name="dashboard_button" format="reference" />

View file

@ -58,6 +58,13 @@
<color name="icon_color">#727272</color>
<color name="icon_color_light">#ccc</color>
<color name="ctx_menu_info_view_bg_light">#eaeaea</color>
<color name="ctx_menu_info_view_bg_dark">#292f33</color>
<color name="ctx_menu_info_text_light">#212121</color>
<color name="ctx_menu_info_text_dark">#b4c3cc</color>
<color name="ctx_menu_info_divider_light">#d9d9d9</color>
<color name="ctx_menu_info_divider_dark">#333b40</color>
<color name="dashboard_gpx_on_map">#448AFF</color>
<color name="dashboard_background">#eaeaea</color>
<color name="dashboard_divider_light">#F0F0F0</color>

View file

@ -627,24 +627,24 @@
<string name="poi_hunting_lodge">Hunting lodge</string>
<string name="poi_place_of_worship">Place of worship</string>
<string name="poi_religion_christian">Place of worship: christian</string>
<string name="poi_religion_jewish">Place of worship: jewish</string>
<string name="poi_religion_muslim">Place of worship: muslim</string>
<string name="poi_religion_sikh">Place of worship: sikh</string>
<string name="poi_religion_buddhist">Place of worship: buddhist</string>
<string name="poi_religion_hindu">Place of worship: hindu</string>
<string name="poi_religion_shinto">Place of worship: shinto</string>
<string name="poi_religion_taoist">Place of worship: taoist</string>
<string name="poi_religion_christian">Сhristianity</string>
<string name="poi_religion_jewish">Judaism</string>
<string name="poi_religion_muslim">Islam</string>
<string name="poi_religion_sikh">Sikhism</string>
<string name="poi_religion_buddhist">Buddhism</string>
<string name="poi_religion_hindu">Hinduism</string>
<string name="poi_religion_shinto">Shinto</string>
<string name="poi_religion_taoist">Taoism</string>
<string name="poi_religion_voodoo">Voodoo</string>
<string name="poi_religion_unitarian_universalist">Unitarian universalist</string>
<string name="poi_religion_unitarian_universalist">Unitarian universalism</string>
<string name="poi_religion_multifaith">Multifaith</string>
<string name="poi_religion_jain">Jain</string>
<string name="poi_religion_spiritualist">Spiritualist</string>
<string name="poi_religion_bahai">Bahai</string>
<string name="poi_religion_scientologist">Scientologist</string>
<string name="poi_religion_pagan">Pagan</string>
<string name="poi_religion_jain">Jainism</string>
<string name="poi_religion_spiritualist">Spiritualism</string>
<string name="poi_religion_bahai">Bahaism</string>
<string name="poi_religion_scientologist">Scientologism</string>
<string name="poi_religion_pagan">Paganism</string>
<string name="poi_religion_tenrikyo">Tenrikyo</string>
<string name="poi_religion_zoroastrian">Zoroastrian</string>
<string name="poi_religion_zoroastrian">Zoroastrism</string>
<string name="poi_denomination_catholic">Catholic</string>
<string name="poi_denomination_baptist">Baptist</string>
@ -661,18 +661,18 @@
<string name="poi_denomination_pentecostal">Pentecostal</string>
<string name="poi_denomination_mormon">Mormon</string>
<string name="poi_denomination_jehovahs_witness">Jehovahs witness</string>
<string name="poi_denomination_greek_orthodox">Greek_orthodox</string>
<string name="poi_denomination_greek_orthodox">Greek orthodox</string>
<string name="poi_denomination_reformed">Reformed</string>
<string name="poi_denomination_seventh_day_adventist">Seventh_day_adventist</string>
<string name="poi_denomination_new_apostolic">New_apostolic</string>
<string name="poi_denomination_church_of_england">Church_of_england</string>
<string name="poi_denomination_seventh_day_adventist">Seventh day adventist</string>
<string name="poi_denomination_new_apostolic">New apostolic</string>
<string name="poi_denomination_church_of_england">Church of england</string>
<string name="poi_denomination_episcopal">Episcopal</string>
<string name="poi_denomination_shia">Shia</string>
<string name="poi_denomination_united">United</string>
<string name="poi_denomination_greek_catholic">Greek catholic</string>
<string name="poi_denomination_tibetan">Tibetan</string>
<string name="poi_denomination_united_reformed">United reformed</string>
<string name="poi_denomination_church_of_scotland">Church of scotland</string>
<string name="poi_denomination_church_of_scotland">Church of Scotland</string>
<string name="poi_denomination_salvation_army">Salvation army</string>
<string name="poi_denomination_iglesia_ni_cristo">Iglesia ni cristo</string>
<string name="poi_denomination_uniting">Uniting</string>
@ -1107,6 +1107,7 @@
<string name="poi_crossing_unmarked">Unmarked</string>
<string name="poi_start_date">Start date</string>
<string name="poi_wheelchair">Wheelchair</string>
<string name="poi_wholesale">Wholesale</string>
<string name="poi_access_private">Private access</string>
<string name="poi_access_no">No access</string>
@ -1139,6 +1140,53 @@
<string name="poi_nudism_customary">Nudism: customary<string/>
<string name="poi_nudism_permissive">Nudism: permissive<string/>
<string name="poi_trade_building_supplies">Building supplies</string>
<string name="poi_trade_plumbing">Plumbing supplies</string>
<string name="poi_trade_wood">Wood supplies</string>
<string name="poi_trade_agricultural_supplies">Agricultural supplies</string>
<string name="poi_trade_tile">Tile supplies</string>
<string name="poi_population">Population</string>
<string name="poi_parking_underground">Underground</string>
<string name="poi_parking_multi_storey">Multi-storey</string>
<string name="poi_bicycle_parking_stands">Stands</string>
<string name="poi_bicycle_parking_wall_loops">Wall loops</string>
<string name="poi_bicycle_parking_rack">Rack</string>
<string name="poi_bicycle_parking_building">Building</string>
<string name="poi_bicycle_parking_shed">Shed</string>
<string name="poi_bicycle_parking_bollard">Bollard</string>
<string name="poi_bicycle_parking_informal">Informal</string>
<string name="poi_leaf_type_broadleaved">Broadleaved</string>
<string name="poi_leaf_type_needleleaved">Needleleaved</string>
<string name="poi_leaf_type_mixed">Mixed</string>
<string name="poi_leaf_type_leafless">Leafless</string>
<string name="poi_trees_olive">Olive</string>
<string name="poi_trees_apple">Apple</string>
<string name="poi_trees_oil">Palm oil</string>
<string name="poi_trees_orange">Orange</string>
<string name="poi_trees_almond">Almond</string>
<string name="poi_trees_banana">Banana</string>
<string name="poi_trees_hazel">Hazel</string>
<string name="poi_trees_coconut">Coconut</string>
<string name="poi_trees_persimmon">Persimmon</string>
<string name="poi_trees_cherry">Cherry</string>
<string name="poi_trees_walnut">Walnut</string>
<string name="poi_trees_plum">Plum</string>
<string name="poi_trees_peach">Peach</string>
<string name="poi_trees_tea">Tea</string>
<string name="poi_trees_coca">Coca</string>
<string name="poi_trees_kiwi">Kiwi</string>
<string name="poi_trees_meadow_orchard">Meadow orchard</string>
<string name="poi_trees_nectorine">Nectorine</string>
<string name="poi_trees_mango">Mango</string>
<string name="poi_trees_rubber">Rubber</string>
<string name="poi_trees_date">Date</string>
<string name="poi_trees_coffea">Coffee</string>
<string name="poi_trees_pomegranate">Pomegranate</string>
<string name="poi_enforcement_traffic_signals">Enforcement:traffic signals</string>
<string name="poi_enforcement_maxspeed">Enforcement:maxspeed</string>
<string name="poi_enforcement_maxheight">Enforcement:maxheight</string>

View file

@ -2260,4 +2260,7 @@ Afghanistan, Albania, Algeria, Andorra, Angola, Anguilla, Antigua and Barbuda, A
<string name="working_days">Working days</string>
<string name="recent_places">Recent places</string>
<string name="favourites">Favourites</string>
<string name="saved_at_time">Successfully saved at: %1$s</string>
<string name="poi_deleted_localy">POI will be deleted once you upload your changes</string>
<string name="show_gpx">Show GPX</string>
</resources>

View file

@ -69,6 +69,7 @@
<item name="bg_map_context_menu">@drawable/bg_map_context_menu_light</item>
<item name="dashboard_divider">@color/dashboard_divider_light</item>
<item name="dashboard_button">@drawable/dashboard_button_light</item>
<item name="ctx_menu_info_view_bg">@color/ctx_menu_info_view_bg_light</item>
<item name="search_background">@color/search_background_dark</item>
<item name="actionModeCloseDrawable">@drawable/ic_action_mode_back</item>
<item name="actionModeStyle">@style/WhiteActionMode</item>
@ -115,6 +116,7 @@
<item name="android:textColorPrimary">@color/color_white</item>
<item name="android:textColorSecondary">@color/inactive_item_orange</item>
<item name="android:textColorHint">@color/inactive_item_orange</item>
<item name="pstsIndicatorColor">@color/osmand_orange</item>
<item name="colorAccent">@color/color_white</item>
<!--<item name="actionMenuTextColor">@color/color_white</item>-->
</style>
@ -130,21 +132,17 @@
</style>
<style name="OsmandDarkTheme.DarkActionbar">
<item name="android:textColorPrimary">@color/color_white</item>
<item name="android:textColorSecondary">@color/inactive_item_orange</item>
<item name="android:textColorHint">@color/inactive_item_orange</item>
<item name="colorAccent">@color/color_white</item>
<!--<item name="actionMenuTextColor">@color/color_white</item>-->
<item name="android:textColorSecondary">@color/dash_search_icon_dark</item>
</style>
<style name="OsmandDarkTheme.Toolbar">
<item name="android:textColorPrimary">@color/color_white</item>
<item name="android:textColorSecondary">@color/color_white</item>
<item name="android:textColorSecondary">@color/dash_search_icon_dark</item>
</style>
<style name="OsmandDarkTheme.NewAppTheme">
<item name="android:textColorSecondary">@color/dash_search_icon_dark</item>
<item name="colorAccent">@color/osmand_orange</item>
<item name="android:textColorSecondary">@color/divider_color</item>
</style>
<style name="OsmandDarkTheme" parent="Theme.AppCompat">
@ -164,6 +162,7 @@
<item name="bg_map_context_menu">@drawable/bg_map_context_menu_dark</item>
<item name="dashboard_divider">@color/dashboard_divider_dark</item>
<item name="dashboard_button">@drawable/dashboard_button_dark</item>
<item name="ctx_menu_info_view_bg">@color/ctx_menu_info_view_bg_dark</item>
<item name="search_background">@color/color_white</item>
<item name="switch_ex_background">@drawable/switch_ex_background_dark</item>
<item name="switch_ex_text_color">@color/switch_ex_button_text_dark</item>
@ -184,7 +183,7 @@
<item name="android:textColorPrimary">@color/color_white</item>
<item name="spinnerItemTextColor">@color/color_white</item>
<item name="spinnerListBackground">@color/spinner_list_background_dark</item>
<item name="colorButtonNormal">@color/bg_color_dark</item>
<item name="colorButtonNormal">@color/actionbar_dark_color</item>
<item name="android:actionModeBackground">@color/actionbar_dark_color</item>
<item name="android:actionBarStyle">@style/Widget.Styled.ActionBarDark</item>

View file

@ -1,5 +1,6 @@
package net.osmand.data;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
@ -15,7 +16,7 @@ import net.osmand.util.Algorithms;
import android.content.Context;
import android.support.annotation.NonNull;
public class PointDescription {
public class PointDescription implements Serializable {
private String type = "";
private String name = "";
private String typeName;
@ -23,6 +24,8 @@ public class PointDescription {
private double lat = 0;
private double lon = 0;
private static final long serialVersionUID = 4078409090417168638L;
public static final String POINT_TYPE_FAVORITE = "favorite";
public static final String POINT_TYPE_WPT = "wpt";
public static final String POINT_TYPE_POI = "poi";

View file

@ -146,13 +146,15 @@ public class AppInitializer implements IProgress {
return false;
}
public boolean checkPreviousRunsForExceptions(Activity activity) {
public boolean checkPreviousRunsForExceptions(Activity activity, boolean writeFileSize) {
initUiVars(activity);
long size = activity.getPreferences(Context.MODE_WORLD_READABLE).getLong(EXCEPTION_FILE_SIZE, 0);
final File file = app.getAppPath(OsmandApplication.EXCEPTION_PATH);
if (file.exists() && file.length() > 0) {
if (size != file.length() && !firstTime) {
activity.getPreferences(Context.MODE_WORLD_WRITEABLE).edit().putLong(EXCEPTION_FILE_SIZE, file.length()).commit();
if (writeFileSize) {
activity.getPreferences(Context.MODE_WORLD_WRITEABLE).edit().putLong(EXCEPTION_FILE_SIZE, file.length()).commit();
}
return true;
}
} else {
@ -440,11 +442,16 @@ public class AppInitializer implements IProgress {
osmandSettings.NATIVE_RENDERING_FAILED.set(true);
startTask(app.getString(R.string.init_native_library), -1);
RenderingRulesStorage storage = app.getRendererRegistry().getCurrentSelectedRenderer();
boolean initialized = NativeOsmandLibrary.getLibrary(storage, app) != null;
NativeOsmandLibrary lib = NativeOsmandLibrary.getLibrary(storage, app);
boolean initialized = lib != null;
osmandSettings.NATIVE_RENDERING_FAILED.set(false);
if (!initialized) {
LOG.info("Native library could not be loaded!");
} else {
File ls = app.getAppPath("fonts");
lib.loadFontData(ls);
}
}
app.getResourceManager().initMapBoundariesCacheNative();
}

View file

@ -520,7 +520,7 @@ public class FavouritesDbHelper {
return null;
}
public void editFavouriteGroup(FavoriteGroup group, int color, boolean visible) {
public void editFavouriteGroup(FavoriteGroup group, String newName, int color, boolean visible) {
if(color != 0 && group.color != color) {
FavoriteGroup gr = flatGroups.get(group.name);
group.color = color;
@ -535,6 +535,13 @@ public class FavouritesDbHelper {
p.setVisible(visible);
}
}
if (!group.name.equals(newName)) {
FavoriteGroup gr = flatGroups.get(group.name);
group.name = newName;
for(FavouritePoint p : gr.points) {
p.setCategory(newName);
}
}
saveCurrentPointsIntoFile();
}

View file

@ -22,7 +22,7 @@ public class IconsCache {
d = app.getResources().getDrawable(resId).mutate();
d.clearColorFilter();
if (clrId != 0) {
d.setColorFilter(app.getResources().getColor(clrId), PorterDuff.Mode.MULTIPLY);
d.setColorFilter(app.getResources().getColor(clrId), PorterDuff.Mode.SRC_IN);
}
drawable.put(hash, d);
}
@ -35,7 +35,7 @@ public class IconsCache {
if(d == null) {
d = app.getResources().getDrawable(resId).mutate();
d.clearColorFilter();
d.setColorFilter(color, PorterDuff.Mode.MULTIPLY);
d.setColorFilter(color, PorterDuff.Mode.SRC_IN);
drawable.put(hash, d);
}
return d;

View file

@ -84,7 +84,7 @@ public class OsmAndLocationSimulation {
@Override
public boolean processResult(GPXUtilities.GPXFile[] result) {
GPXRouteParamsBuilder builder = new GPXRouteParamsBuilder(result[0], app.getSettings());
startAnimationThread(app.getRoutingHelper(), ma, builder.getPoints(), true,
startAnimationThread(app, builder.getPoints(), true,
speedup.getProgress() + 1);
return true;
}
@ -94,7 +94,7 @@ public class OsmAndLocationSimulation {
if(currentRoute.isEmpty()) {
AccessibleToast.makeText(app, R.string.animate_routing_route_not_calculated, Toast.LENGTH_LONG).show();
} else {
startAnimationThread(app.getRoutingHelper(), ma, new ArrayList<Location>(currentRoute), false, 1);
startAnimationThread(app, new ArrayList<Location>(currentRoute), false, 1);
}
}
@ -107,8 +107,7 @@ public class OsmAndLocationSimulation {
}
}
private void startAnimationThread(final RoutingHelper routingHelper,
final MapActivity ma, final List<Location> directions, final boolean useLocationTime, final float coeff) {
private void startAnimationThread(final OsmandApplication app, final List<Location> directions, final boolean useLocationTime, final float coeff) {
final float time = 1.5f;
routeAnimation = new Thread() {
@Override
@ -148,7 +147,7 @@ public class OsmAndLocationSimulation {
current.setBearing(prev.bearingTo(current));
}
final Location toset = current;
ma.runOnUiThread(new Runnable() {
app.runInUIThread(new Runnable() {
@Override
public void run() {
provider.setLocationFromSimulation(toset);

View file

@ -493,31 +493,38 @@ public class FavoritesTreeFragment extends OsmandExpandableListFragment {
}
protected void openChangeGroupDialog(final FavoriteGroup group) {
Builder bld = new AlertDialog.Builder(getActivity());
View favEdit = getActivity().getLayoutInflater().inflate(R.layout.fav_group_edit, null);
final TIntArrayList list = new TIntArrayList();
final Spinner colorSpinner = (Spinner) favEdit.findViewById(R.id.ColorSpinner);
final int intColor = group.color == 0? getResources().getColor(R.color.color_favorite) : group.color;
ColorDialogs.setupColorSpinner(getActivity(), intColor, colorSpinner, list);
Builder builder = new AlertDialog.Builder(getActivity());
View view = getActivity().getLayoutInflater().inflate(R.layout.fav_group_edit, null);
final CheckBox checkBox = (CheckBox) favEdit.findViewById(R.id.Visibility);
final EditText nameEditText = (EditText) view.findViewById(R.id.nameEditText);
nameEditText.setText(group.name);
final CheckBox checkBox = (CheckBox) view.findViewById(R.id.Visibility);
checkBox.setChecked(group.visible);
bld.setTitle(R.string.edit_group);
bld.setView(favEdit);
bld.setNegativeButton(R.string.shared_string_cancel, null);
bld.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
final Spinner colorSpinner = (Spinner) view.findViewById(R.id.ColorSpinner);
final TIntArrayList list = new TIntArrayList();
final int intColor = group.color == 0? getResources().getColor(R.color.color_favorite) : group.color;
ColorDialogs.setupColorSpinner(getActivity(), intColor, colorSpinner, list);
builder.setTitle(R.string.edit_group);
builder.setView(view);
builder.setNegativeButton(R.string.shared_string_cancel, null);
builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int clr = list.get(colorSpinner.getSelectedItemPosition());
if(clr != intColor || group.visible != checkBox.isChecked()) {
getMyApplication().getFavorites().editFavouriteGroup(group, clr, checkBox.isChecked());
String name = nameEditText.getText().toString();
if (clr != intColor || group.visible != checkBox.isChecked()) {
getMyApplication().getFavorites().editFavouriteGroup(group, name, clr,
checkBox.isChecked());
favouritesAdapter.notifyDataSetInvalidated();
}
}
});
bld.show();
builder.show();
}

View file

@ -125,6 +125,7 @@ public class MapActivity extends AccessibleActivity {
private boolean intentLocation = false;
private DashboardOnMap dashboardOnMap = new DashboardOnMap(this);
private MapContextMenu contextMenuOnMap;
private AppInitializeListener initListener;
private IMapDownloaderCallback downloaderCallback;
private DrawerLayout drawerLayout;
@ -156,6 +157,7 @@ public class MapActivity extends AccessibleActivity {
app = getMyApplication();
settings = app.getSettings();
app.applyTheme(this);
contextMenuOnMap = new MapContextMenu(app);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// Full screen is not used here
@ -249,9 +251,6 @@ public class MapActivity extends AccessibleActivity {
});
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
MapContextMenu.getInstance().setApp(app);
MapContextMenu.getInstance().setMapActivity(this);
}
@ -975,6 +974,10 @@ public class MapActivity extends AccessibleActivity {
return dashboardOnMap;
}
public MapContextMenu getContextMenu() {
return contextMenuOnMap;
}
public void openDrawer() {
drawerLayout.openDrawer(Gravity.LEFT);
}

View file

@ -218,7 +218,8 @@ public class MapActivityLayers {
if (g.showCurrentTrack) {
if (!settings.SAVE_TRACK_TO_GPX.get() && !
settings.SAVE_GLOBAL_TRACK_TO_GPX.get()) {
AccessibleToast.makeText(activity, R.string.gpx_monitoring_disabled_warn, Toast.LENGTH_LONG).show();
AccessibleToast.makeText(activity,
R.string.gpx_monitoring_disabled_warn, Toast.LENGTH_LONG).show();
} else {
g.path = getString(R.string.show_current_gpx_title);
}

View file

@ -548,6 +548,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
recordControl = null;
mapInfoLayer.recreateControls();
}
recordControl = null;
}
}

View file

@ -143,7 +143,6 @@ public class MapViewTrackingUtilities implements OsmAndLocationListener, IMapLoc
public boolean isShowViewAngle() {
return showViewAngle;
}

View file

@ -8,7 +8,6 @@ import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.animation.Animation;
@ -32,6 +31,7 @@ import com.github.ksoichiro.android.observablescrollview.ObservableScrollView;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks;
import com.github.ksoichiro.android.observablescrollview.ScrollState;
import net.osmand.PlatformUtil;
import net.osmand.data.LatLon;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuAdapter.OnContextMenuClick;
@ -64,7 +64,8 @@ import java.util.List;
/**
*/
public class DashboardOnMap implements ObservableScrollViewCallbacks {
private static final org.apache.commons.logging.Log LOG =
PlatformUtil.getLog(DashboardOnMap.class);
private static final String TAG = "DashboardOnMap";
public static boolean staticVisible = false;
public static DashboardType staticVisibleType = DashboardType.DASHBOARD;
@ -72,7 +73,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
private static final DashFragmentData.ShouldShowFunction rateUsShouldShow = new DashRateUsFragment.RateUsShouldShow();
private static final DefaultShouldShow defaultShouldShow = new DefaultShouldShow();
private static final DefaultShouldShow errorShouldShow = new ErrorShouldShow();
private static final DashFragmentData.ShouldShowFunction errorShouldShow = new ErrorShouldShow();
private static final DashFragmentData.ShouldShowFunction firstTimeShouldShow = new FirstTimeShouldShow();
private static final DashFragmentData.ShouldShowFunction chooseAppDirShouldShow = new ChooseAppDirShouldShow();
@ -390,9 +391,11 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
public void hideDashboard() {
setDashboardVisibility(false, visibleType);
}
public void hideDashboard(boolean animation) {
setDashboardVisibility(false, visibleType, animation);
}
public void setDashboardVisibility(boolean visible, DashboardType type) {
setDashboardVisibility(visible, type, this.visible ? visibleType : null, true);
}
@ -656,11 +659,9 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
private void addOrUpdateDashboardFragments() {
Log.v(TAG, "addOrUpdateDashboardFragments(" + ")");
OsmandSettings settings = getMyApplication().getSettings();
TransactionBuilder builder =
new TransactionBuilder(mapActivity.getSupportFragmentManager(), settings, mapActivity);
Log.v(TAG, "pluginsCards=" + OsmandPlugin.getPluginsCardsList());
builder.addFragmentsData(fragmentsData)
.addFragmentsData(OsmandPlugin.getPluginsCardsList())
.getFragmentTransaction().commit();
@ -911,10 +912,9 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
}
public boolean hasCriticalMessages() {
final OsmandSettings settings = getMyApplication().getSettings();
return rateUsShouldShow.shouldShow(settings, mapActivity, DashRateUsFragment.TAG)
|| errorShouldShow.shouldShow(settings, mapActivity, DashErrorFragment.TAG);
|| errorShouldShow.shouldShow(null, mapActivity, null);
}
View getParentView() {
@ -928,6 +928,7 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
.makeGlobal().get();
}
}
public static class DefaultShouldShow extends SettingsShouldShow {
@Override
public boolean shouldShow(OsmandSettings settings, MapActivity activity, String tag) {
@ -936,11 +937,12 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks {
}
}
private static class ErrorShouldShow extends DefaultShouldShow {
private static class ErrorShouldShow implements DashFragmentData.ShouldShowFunction {
// If settings null. No changes in setting will be made.
@Override
public boolean shouldShow(OsmandSettings settings, MapActivity activity, String tag) {
return super.shouldShow(settings, activity, tag) && activity.getMyApplication()
.getAppInitializer().checkPreviousRunsForExceptions(activity);
return activity.getMyApplication().getAppInitializer()
.checkPreviousRunsForExceptions(activity, settings != null);
}
}

View file

@ -5,7 +5,6 @@ import android.app.Application;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Build;
import android.support.v7.app.AlertDialog;
import android.util.TypedValue;
import android.view.View;
@ -53,9 +52,8 @@ public class GpxUiHelper {
}
public static String getColorValue(String clr, String value, boolean html) {
if(!html) {
if (!html) {
return value;
}
return "<font color=\"" + clr + "\">" + value + "</font>";
@ -67,7 +65,7 @@ public class GpxUiHelper {
public static String getDescription(OsmandApplication app, GPXTrackAnalysis analysis, boolean html) {
StringBuilder description = new StringBuilder();
String nl = html?"<br/>":"\n";
String nl = html ? "<br/>" : "\n";
String timeSpanClr = Algorithms.colorToString(app.getResources().getColor(R.color.gpx_time_span_color));
String distanceClr = Algorithms.colorToString(app.getResources().getColor(R.color.gpx_distance_color));
String speedClr = Algorithms.colorToString(app.getResources().getColor(R.color.gpx_speed));
@ -76,31 +74,31 @@ public class GpxUiHelper {
// OUTPUT:
// 1. Total distance, Start time, End time
description.append(app.getString(R.string.gpx_info_distance, getColorValue(distanceClr,
OsmAndFormatter.getFormattedDistance(analysis.totalDistance, app), html),
getColorValue(distanceClr, analysis.points+"", html) ));
if(analysis.totalTracks > 1) {
description.append(nl).append(app.getString(R.string.gpx_info_subtracks, getColorValue(speedClr, analysis.totalTracks+"", html)));
OsmAndFormatter.getFormattedDistance(analysis.totalDistance, app), html),
getColorValue(distanceClr, analysis.points + "", html)));
if (analysis.totalTracks > 1) {
description.append(nl).append(app.getString(R.string.gpx_info_subtracks, getColorValue(speedClr, analysis.totalTracks + "", html)));
}
if(analysis.wptPoints > 0) {
description.append(nl).append(app.getString(R.string.gpx_info_waypoints, getColorValue(speedClr, analysis.wptPoints+"", html)));
if (analysis.wptPoints > 0) {
description.append(nl).append(app.getString(R.string.gpx_info_waypoints, getColorValue(speedClr, analysis.wptPoints + "", html)));
}
if(analysis.isTimeSpecified()) {
description.append(nl).append(app.getString(R.string.gpx_info_start_time, analysis.startTime));
description.append(nl).append(app.getString(R.string.gpx_info_end_time, analysis.endTime));
if (analysis.isTimeSpecified()) {
description.append(nl).append(app.getString(R.string.gpx_info_start_time, analysis.startTime));
description.append(nl).append(app.getString(R.string.gpx_info_end_time, analysis.endTime));
}
// 2. Time span
if(analysis.timeSpan > 0 && analysis.timeSpan / 1000 != analysis.timeMoving / 1000) {
final String formatDuration = Algorithms.formatDuration((int) (analysis.timeSpan/1000)
);
if (analysis.timeSpan > 0 && analysis.timeSpan / 1000 != analysis.timeMoving / 1000) {
final String formatDuration = Algorithms.formatDuration((int) (analysis.timeSpan / 1000)
);
description.append(nl).append(app.getString(R.string.gpx_timespan,
getColorValue(timeSpanClr, formatDuration, html)));
}
// 3. Time moving, if any
if(analysis.isTimeMoving()){
final String formatDuration = Algorithms.formatDuration((int) (analysis.timeMoving/1000)
);
if (analysis.isTimeMoving()) {
final String formatDuration = Algorithms.formatDuration((int) (analysis.timeMoving / 1000)
);
description.append(nl).append(app.getString(R.string.gpx_timemoving,
getColorValue(timeSpanClr, formatDuration, html)));
}
@ -115,32 +113,32 @@ public class GpxUiHelper {
String max = getColorValue(ascClr, OsmAndFormatter.getFormattedAlt(analysis.maxElevation, app), html);
String asc = getColorValue(ascClr, OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app), html);
String desc = getColorValue(descClr, OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app), html);
description.append(app.getString(R.string.gpx_info_diff_altitude,min +" - " + max ));
description.append(app.getString(R.string.gpx_info_diff_altitude, min + " - " + max));
description.append(nl);
description.append(app.getString(R.string.gpx_info_asc_altitude,"\u2193 " + desc + " \u2191 " + asc + ""));
description.append(app.getString(R.string.gpx_info_asc_altitude, "\u2193 " + desc + " \u2191 " + asc + ""));
}
if(analysis.isSpeedSpecified()){
if (analysis.isSpeedSpecified()) {
String avg = getColorValue(speedClr, OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app), html);
String max = getColorValue(ascClr, OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app), html);
description.append(nl).append(app.getString(R.string.gpx_info_average_speed,avg));
description.append(nl).append(app.getString(R.string.gpx_info_maximum_speed,max));
description.append(nl).append(app.getString(R.string.gpx_info_average_speed, avg));
description.append(nl).append(app.getString(R.string.gpx_info_maximum_speed, max));
}
return description.toString();
}
public static AlertDialog selectGPXFile(List<String> selectedGpxList, final Activity activity,
final boolean showCurrentGpx, final boolean multipleChoice, final CallbackWithObject<GPXFile[]> callbackWithObject){
final boolean showCurrentGpx, final boolean multipleChoice, final CallbackWithObject<GPXFile[]> callbackWithObject) {
OsmandApplication app = (OsmandApplication) activity.getApplication();
final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
final List<String> allGpxList = getSortedGPXFilenames(dir, false);
if(allGpxList.isEmpty()){
if (allGpxList.isEmpty()) {
AccessibleToast.makeText(activity, R.string.gpx_files_not_found, Toast.LENGTH_LONG).show();
}
if(!allGpxList.isEmpty() || showCurrentGpx){
if(showCurrentGpx){
if (!allGpxList.isEmpty() || showCurrentGpx) {
if (showCurrentGpx) {
allGpxList.add(0, activity.getString(R.string.show_current_gpx_title));
}
final ContextMenuAdapter adapter = createGpxContextMenuAdapter(activity, allGpxList, selectedGpxList, multipleChoice,
@ -152,15 +150,15 @@ public class GpxUiHelper {
}
public static AlertDialog selectGPXFile(final Activity activity,
final boolean showCurrentGpx, final boolean multipleChoice, final CallbackWithObject<GPXFile[]> callbackWithObject) {
final boolean showCurrentGpx, final boolean multipleChoice, final CallbackWithObject<GPXFile[]> callbackWithObject) {
OsmandApplication app = (OsmandApplication) activity.getApplication();
final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
final List<String> list = getSortedGPXFilenames(dir, false);
if(list.isEmpty()){
if (list.isEmpty()) {
AccessibleToast.makeText(activity, R.string.gpx_files_not_found, Toast.LENGTH_LONG).show();
}
if(!list.isEmpty() || showCurrentGpx){
if(showCurrentGpx){
if (!list.isEmpty() || showCurrentGpx) {
if (showCurrentGpx) {
list.add(0, activity.getString(R.string.show_current_gpx_title));
}
@ -197,9 +195,9 @@ public class GpxUiHelper {
}
protected static void updateSelection(List<String> selectedGpxList, boolean showCurrentTrack,
final ContextMenuAdapter adapter, int i, String fileName) {
if(i == 0 && showCurrentTrack) {
if(selectedGpxList.contains("")) {
final ContextMenuAdapter adapter, int i, String fileName) {
if (i == 0 && showCurrentTrack) {
if (selectedGpxList.contains("")) {
adapter.setSelection(i, 1);
}
} else {
@ -213,7 +211,7 @@ public class GpxUiHelper {
}
private static void setDescripionInDialog(final ArrayAdapter<?> adapter, final ContextMenuAdapter cmAdapter, Activity activity,
final File dir, String filename, final int position) {
final File dir, String filename, final int position) {
final Application app = activity.getApplication();
final File f = new File(dir, filename);
loadGPXFileInDifferentThread(activity, new CallbackWithObject<GPXUtilities.GPXFile[]>() {
@ -228,19 +226,14 @@ public class GpxUiHelper {
}
private static AlertDialog createDialog(final Activity activity, final boolean showCurrentGpx,
final boolean multipleChoice, final CallbackWithObject<GPXFile[]> callbackWithObject,
final List<String> list, final ContextMenuAdapter adapter) {
final boolean multipleChoice, final CallbackWithObject<GPXFile[]> callbackWithObject,
final List<String> list, final ContextMenuAdapter adapter) {
final OsmandApplication app = (OsmandApplication) activity.getApplication();
final File dir = app.getAppPath(IndexConstants.GPX_INDEX_DIR);
AlertDialog.Builder b = new AlertDialog.Builder(activity);
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
// final int padding = (int) (12 * activity.getResources().getDisplayMetrics().density + 0.5f);
final boolean light = app.getSettings().isLightContent();
final int layout;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
layout = R.layout.list_menu_item;
} else {
layout = R.layout.list_menu_item_native;
}
final int layout = R.layout.list_menu_item_native;
final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(activity, layout, R.id.title,
adapter.getItemNames()) {
@ -258,7 +251,7 @@ public class GpxUiHelper {
return;
}
int nline = adapter.getItemName(position).indexOf('\n');
if(nline == -1) {
if (nline == -1) {
setDescripionInDialog(arrayAdapter, adapter, activity, dir, list.get(position), position);
} else {
adapter.setItemName(position, adapter.getItemName(position).substring(0, nline));
@ -267,7 +260,7 @@ public class GpxUiHelper {
}
});
if(showCurrentGpx && position == 0) {
if (showCurrentGpx && position == 0) {
icon.setVisibility(View.INVISIBLE);
} else {
icon.setVisibility(View.VISIBLE);
@ -303,35 +296,37 @@ public class GpxUiHelper {
public void onClick(DialogInterface dialog, int position) {
}
};
b.setAdapter(listAdapter, onClickListener);
builder.setAdapter(listAdapter, onClickListener);
if (multipleChoice) {
b.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
builder.setTitle(R.string.show_gpx)
.setPositiveButton(R.string.shared_string_ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
GPXFile currentGPX = null;
//clear all previously selected files before adding new one
OsmandApplication app = (OsmandApplication) activity.getApplication();
if(app != null && app.getSelectedGpxHelper() != null){
app.getSelectedGpxHelper().clearAllGpxFileToShow();
}
if (showCurrentGpx && adapter.getSelection(0) > 0) {
currentGPX = app.getSavingTrackHelper().getCurrentGpx();
}
List<String> s = new ArrayList<String>();
for (int i = (showCurrentGpx ? 1 : 0); i < adapter.length(); i++) {
if (adapter.getSelection(i) > 0) {
s.add(list.get(i));
@Override
public void onClick(DialogInterface dialog, int which) {
GPXFile currentGPX = null;
//clear all previously selected files before adding new one
OsmandApplication app = (OsmandApplication) activity.getApplication();
if (app != null && app.getSelectedGpxHelper() != null) {
app.getSelectedGpxHelper().clearAllGpxFileToShow();
}
if (showCurrentGpx && adapter.getSelection(0) > 0) {
currentGPX = app.getSavingTrackHelper().getCurrentGpx();
}
List<String> s = new ArrayList<>();
for (int i = (showCurrentGpx ? 1 : 0); i < adapter.length(); i++) {
if (adapter.getSelection(i) > 0) {
s.add(list.get(i));
}
}
dialog.dismiss();
loadGPXFileInDifferentThread(activity, callbackWithObject, dir, currentGPX,
s.toArray(new String[s.size()]));
}
}
dialog.dismiss();
loadGPXFileInDifferentThread(activity, callbackWithObject, dir, currentGPX,
s.toArray(new String[s.size()]));
}
});
})
.setNegativeButton(R.string.shared_string_cancel, null);
}
final AlertDialog dlg = b.create();
final AlertDialog dlg = builder.create();
dlg.setCanceledOnTouchOutside(true);
dlg.getListView().setOnItemClickListener(new OnItemClickListener() {
@Override
@ -360,16 +355,16 @@ public class GpxUiHelper {
}
public static List<String> getSortedGPXFilenamesByDate(File dir, boolean absolutePath) {
final Map<String, Long> mp = new HashMap<String, Long>();
final Map<String, Long> mp = new HashMap<>();
readGpxDirectory(dir, mp, "", absolutePath);
ArrayList<String> list = new ArrayList<String>(mp.keySet());
ArrayList<String> list = new ArrayList<>(mp.keySet());
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String object1, String object2) {
Long l1 = mp.get(object1);
Long l2 = mp.get(object2);
long lhs = l1 == null ? 0 : l1.longValue();
long rhs = l2 == null ? 0 : l2.longValue();
long lhs = l1 == null ? 0 : l1;
long rhs = l2 == null ? 0 : l2;
return lhs < rhs ? 1 : (lhs == rhs ? 0 : -1);
}
});
@ -378,9 +373,9 @@ public class GpxUiHelper {
public static List<String> getSortedGPXFilenames(File dir, boolean absolutePath) {
final Map<String, Long> mp = new HashMap<String, Long>();
final Map<String, Long> mp = new HashMap<>();
readGpxDirectory(dir, mp, "", absolutePath);
ArrayList<String> list = new ArrayList<String>(mp.keySet());
ArrayList<String> list = new ArrayList<>(mp.keySet());
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String object1, String object2) {
@ -392,7 +387,7 @@ public class GpxUiHelper {
}
private static void readGpxDirectory(File dir, final Map<String, Long> map, String parent,
boolean absolutePath) {
boolean absolutePath) {
if (dir != null && dir.canRead()) {
File[] files = dir.listFiles();
if (files != null) {
@ -409,7 +404,7 @@ public class GpxUiHelper {
}
private static void loadGPXFileInDifferentThread(final Activity activity, final CallbackWithObject<GPXFile[]> callbackWithObject,
final File dir, final GPXFile currentFile, final String... filename) {
final File dir, final GPXFile currentFile, final String... filename) {
final ProgressDialog dlg = ProgressDialog.show(activity, activity.getString(R.string.loading_smth, ""),
activity.getString(R.string.loading_data));
new Thread(new Runnable() {

View file

@ -1,166 +0,0 @@
package net.osmand.plus.mapcontextmenu;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.osmand.data.Amenity;
import net.osmand.osm.AbstractPoiType;
import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.PoiType;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.util.Algorithms;
import java.util.Map;
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
public class InfoSectionBuilder extends BottomSectionBuilder {
private final Amenity amenity;
public InfoSectionBuilder(OsmandApplication app, final Amenity amenity) {
super(app);
this.amenity = amenity;
}
private void buildRow(View view, int iconId, String text) {
/*
<LinearLayout
android:id="@+id/context_menu_top_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/context_menu_icon_layout"
android:orientation="horizontal"
android:layout_width="42dp"
android:layout_height="match_parent">
<ImageView
android:id="@+id/context_menu_icon_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:scaleType="center"
android:layout_marginStart="12dp"
android:layout_marginLeft="12dp"
android:src="@drawable/ic_action_building_number"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/context_menu_line1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:text="@string/search_address_building"
android:textSize="@dimen/default_list_text_size_large"
android:textColor="?android:textColorPrimary"
android:textStyle="bold"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#c9c9c9"/>
*/
LinearLayout ll = new LinearLayout(view.getContext());
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
// Icon
LinearLayout llIcon = new LinearLayout(view.getContext());
llIcon.setOrientation(LinearLayout.HORIZONTAL);
llIcon.setLayoutParams(new LinearLayout.LayoutParams(dpToPx(42f), ViewGroup.LayoutParams.MATCH_PARENT));
ll.addView(llIcon);
ImageView icon = new ImageView(view.getContext());
ViewGroup.MarginLayoutParams llIconParams = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
llIconParams.setMargins(dpToPx(12f), 0, 0, 0);
//llIconParams.setGravity(Gravity.CENTER_VERTICAL);
icon.setLayoutParams(llIconParams);
icon.setScaleType(ImageView.ScaleType.CENTER);
icon.setImageDrawable(getRowIcon(iconId));
llIcon.addView(icon);
// Text
LinearLayout llText = new LinearLayout(view.getContext());
llText.setOrientation(LinearLayout.VERTICAL);
ViewGroup.MarginLayoutParams llTextParams = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
llTextParams.setMargins(0, dpToPx(4f), 0, dpToPx(4f));
llText.setLayoutParams(llTextParams);
ll.addView(llText);
TextView textView = new TextView(view.getContext());
ViewGroup.MarginLayoutParams llTextViewParams = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
llTextViewParams.setMargins(dpToPx(10f), 0, dpToPx(10f), 0);
llText.setLayoutParams(llTextViewParams);
}
public int dpToPx(float dp) {
Resources r = app.getResources();
return (int) TypedValue.applyDimension(
COMPLEX_UNIT_DIP,
dp,
r.getDisplayMetrics()
);
}
@Override
public void buildSection(View view) {
MapPoiTypes poiTypes = app.getPoiTypes();
for(Map.Entry<String, String> e : amenity.getAdditionalInfo().entrySet()) {
int iconId = 0;
String key = e.getKey();
String vl = e.getValue();
if(key.startsWith("name:")) {
continue;
} else if(Amenity.OPENING_HOURS.equals(key)) {
iconId = R.drawable.mm_clock; // todo: change icon
} else if(Amenity.PHONE.equals(key)) {
iconId = R.drawable.mm_amenity_telephone; // todo: change icon
} else if(Amenity.WEBSITE.equals(key)) {
iconId = R.drawable.mm_internet_access; // todo: change icon
} else {
iconId = R.drawable.ic_type_info; // todo: change icon
AbstractPoiType pt = poiTypes.getAnyPoiAdditionalTypeByKey(e.getKey());
if (pt != null) {
if(pt instanceof PoiType && !((PoiType) pt).isText()) {
vl = pt.getTranslation();
} else {
vl = /*pt.getTranslation() + ": " + */amenity.unzipContent(e.getValue());
}
} else {
vl = /*Algorithms.capitalizeFirstLetterAndLowercase(e.getKey()) +
": " + */amenity.unzipContent(e.getValue());
}
}
buildRow(view, iconId, vl);
}
}
}

View file

@ -1,5 +1,6 @@
package net.osmand.plus.mapcontextmenu;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import net.osmand.binary.RouteDataObject;
@ -12,6 +13,8 @@ import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.sections.AmenityInfoMenuController;
import net.osmand.plus.mapcontextmenu.sections.MenuController;
import net.osmand.plus.render.RenderingIcons;
import net.osmand.plus.routing.RoutingHelper;
import net.osmand.plus.views.OsmandMapLayer;
@ -19,7 +22,6 @@ import net.osmand.util.Algorithms;
public class MapContextMenu {
private MapActivity mapActivity;
private OsmandApplication app;
private OsmandSettings settings;
@ -28,7 +30,10 @@ public class MapContextMenu {
private String foundStreetName;
public boolean isMenuVisible() {
private static final String KEY_CTX_MENU_OBJECT = "key_ctx_menu_object";
private static final String KEY_CTX_MENU_POINT_DESC = "key_ctx_menu_point_desc";
public boolean isMenuVisible(MapActivity mapActivity) {
return mapActivity.getSupportFragmentManager().findFragmentByTag("MapContextMenuFragment") != null;
}
@ -40,29 +45,15 @@ public class MapContextMenu {
return object;
}
public void setMapActivity(MapActivity mapActivity) {
this.mapActivity = mapActivity;
}
public void setApp(OsmandApplication app) {
public MapContextMenu(OsmandApplication app) {
this.app = app;
settings = app.getSettings();
}
private static MapContextMenu ourInstance = new MapContextMenu();
public void show(MapActivity mapActivity, PointDescription pointDescription, Object object) {
public static MapContextMenu getInstance() {
return ourInstance;
}
private MapContextMenu() {
}
public void show(PointDescription pointDescription, Object object) {
if (isMenuVisible())
hide();
if (isMenuVisible(mapActivity))
hide(mapActivity);
this.pointDescription = pointDescription;
this.object = object;
@ -73,7 +64,7 @@ public class MapContextMenu {
}
public void hide() {
public void hide(MapActivity mapActivity) {
Fragment fragment = mapActivity.getSupportFragmentManager().findFragmentByTag("MapContextMenuFragment");
if (fragment != null)
@ -137,29 +128,29 @@ public class MapContextMenu {
return Algorithms.isEmpty(res) ? "Address is unknown yet" : res; // todo: text constant
}
public String getLocationStr() {
public String getLocationStr(MapActivity mapActivity) {
if (foundStreetName == null)
return pointDescription.getLocationName(mapActivity, true).replaceAll("\n", "");
else
return foundStreetName;
}
public BottomSectionBuilder getBottomSectionBuilder() {
public MenuController getMenuController() {
if (object != null) {
if (object instanceof Amenity) {
return new InfoSectionBuilder(app, (Amenity)object);
return new AmenityInfoMenuController(app, (Amenity)object);
}
}
return null;
}
public void buttonNavigatePressed() {
public void buttonNavigatePressed(MapActivity mapActivity) {
mapActivity.getMapActions().showNavigationContextMenuPoint(pointDescription.getLat(), pointDescription.getLon());
}
public void buttonFavoritePressed() {
public void buttonFavoritePressed(MapActivity mapActivity) {
if (object != null && object instanceof FavouritePoint) {
mapActivity.getMapActions().editFavoritePoint((FavouritePoint)object);
} else {
@ -167,11 +158,11 @@ public class MapContextMenu {
}
}
public void buttonSharePressed() {
public void buttonSharePressed(MapActivity mapActivity) {
mapActivity.getMapActions().shareLocation(pointDescription.getLat(), pointDescription.getLon());
}
public void buttonMorePressed() {
public void buttonMorePressed(MapActivity mapActivity) {
final ContextMenuAdapter menuAdapter = new ContextMenuAdapter(mapActivity);
if (object != null) {
for (OsmandMapLayer layer : mapActivity.getMapView().getLayers()) {
@ -181,4 +172,19 @@ public class MapContextMenu {
mapActivity.getMapActions().contextMenuPoint(pointDescription.getLat(), pointDescription.getLon(), menuAdapter, object);
}
public void saveMenuState(Bundle bundle) {
if (object != null) {
if (object instanceof Amenity)
bundle.putSerializable(KEY_CTX_MENU_OBJECT, (Amenity)object);
}
bundle.putSerializable(KEY_CTX_MENU_POINT_DESC, pointDescription);
}
public void restoreMenuState(Bundle bundle) {
object = bundle.getSerializable(KEY_CTX_MENU_OBJECT);
Object pDescObj = bundle.getSerializable(KEY_CTX_MENU_POINT_DESC);
if (pDescObj != null)
pointDescription = (PointDescription)pDescObj;
}
}

View file

@ -2,18 +2,23 @@ package net.osmand.plus.mapcontextmenu;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.DecelerateInterpolator;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.osmand.PlatformUtil;
@ -21,11 +26,14 @@ import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.search.SearchActivity;
import net.osmand.plus.mapcontextmenu.sections.MenuController;
import net.osmand.plus.views.OsmandMapTileView;
import org.apache.commons.logging.Log;
import java.util.Map;
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
import static net.osmand.plus.mapcontextmenu.sections.MenuBuilder.SHADOW_HEIGHT_BOTTOM_DP;
import static net.osmand.plus.mapcontextmenu.sections.MenuBuilder.SHADOW_HEIGHT_TOP_DP;
public class MapContextMenuFragment extends Fragment {
@ -35,8 +43,17 @@ public class MapContextMenuFragment extends Fragment {
private View view;
private View mainView;
private View bottomView;
private View shadowView;
private View bottomBorder;
private float mainViewHeight;
MenuController menuController;
private int menuTopHeight;
private int menuTopShadowHeight;
private int menuButtonsHeight;
private int menuBottomViewHeight;
private int menuFullHeight;
@Override
public void onAttach(Activity activity) {
@ -72,14 +89,56 @@ public class MapContextMenuFragment extends Fragment {
*/
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getCtxMenu().saveMenuState(outState);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (savedInstanceState != null)
getCtxMenu().restoreMenuState(savedInstanceState);
view = inflater.inflate(R.layout.map_context_menu_fragment, container, false);
View shadowView = view.findViewById(R.id.context_menu_shadow_view);
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
menuTopHeight = view.findViewById(R.id.context_menu_top_view).getHeight();
menuTopShadowHeight = view.findViewById(R.id.context_menu_top_shadow).getHeight();
menuButtonsHeight = view.findViewById(R.id.context_menu_buttons).getHeight();
menuBottomViewHeight = view.findViewById(R.id.context_menu_bottom_view).getHeight();
menuFullHeight = view.findViewById(R.id.context_menu_main).getHeight();
ViewTreeObserver obs = view.getViewTreeObserver();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
obs.removeOnGlobalLayoutListener(this);
} else {
obs.removeGlobalOnLayoutListener(this);
}
doLayoutMenu();
}
});
bottomBorder = view.findViewById(R.id.context_menu_bottom_border);
bottomBorder.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
shadowView = view.findViewById(R.id.context_menu_shadow_view);
shadowView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent event) {
dismissMenu();
@ -87,50 +146,150 @@ public class MapContextMenuFragment extends Fragment {
}
});
View topView = view.findViewById(R.id.context_menu_top_view);
mainView = view.findViewById(R.id.context_menu_main);
topView.setOnTouchListener(new View.OnTouchListener() {
final View.OnTouchListener slideTouchListener = new View.OnTouchListener() {
private float dy;
private float dyMain;
private int destinationState;
private VelocityTracker velocity;
private boolean slidingUp;
private boolean slidingDown;
private float velocityY;
private float startX;
private float startY;
private long lastTouchDown;
private final int CLICK_ACTION_THRESHHOLD = 200;
private boolean isClick(float endX, float endY) {
float differenceX = Math.abs(startX - endX);
float differenceY = Math.abs(startY - endY);
if (differenceX > 1 || differenceY > 1 || System.currentTimeMillis() - lastTouchDown > CLICK_ACTION_THRESHHOLD) {
return false;
}
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
lastTouchDown = System.currentTimeMillis();
dy = event.getY();
mainViewHeight = mainView.getHeight();
dyMain = mainView.getY();
velocity = VelocityTracker.obtain();
velocityY = 0;
velocity.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
float y = event.getY();
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mainView.getLayoutParams();
float top = lp.topMargin + (y - dy);
if (top < 0) {
lp.topMargin = (int) top;
mainView.setLayoutParams(lp);
}
float newY = mainView.getY() + (y - dy);
mainView.setY(newY);
ViewGroup.LayoutParams lp = bottomBorder.getLayoutParams();
lp.height = (int)(view.getHeight() - newY - menuFullHeight) + 10;
bottomBorder.setLayoutParams(lp);
bottomBorder.setY(newY + menuFullHeight);
bottomBorder.requestLayout();
velocity.addMovement(event);
velocity.computeCurrentVelocity(1000);
float vel = Math.abs(velocity.getYVelocity());
if (vel > velocityY)
velocityY = vel;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
float endX = event.getX();
float endY = event.getY();
slidingUp = Math.abs(velocityY) > 500 && (mainView.getY() - dyMain) < -50;
slidingDown = Math.abs(velocityY) > 500 && (mainView.getY() - dyMain) > 50;
velocity.recycle();
if (menuController != null) {
if (slidingUp) {
menuController.slideUp();
} else if (slidingDown) {
menuController.slideDown();
}
destinationState = menuController.getCurrentMenuState();
} else {
destinationState = MenuController.MenuState.HEADER_ONLY;
}
float posY = 0;
switch (destinationState) {
case MenuController.MenuState.HEADER_ONLY:
posY = view.getHeight() - (menuFullHeight - menuBottomViewHeight - dpToPx(SHADOW_HEIGHT_BOTTOM_DP));
break;
case MenuController.MenuState.HALF_SCREEN:
posY = view.getHeight() - menuFullHeight;
break;
case MenuController.MenuState.FULL_SCREEN:
posY = -menuTopShadowHeight - dpToPx(SHADOW_HEIGHT_TOP_DP);
break;
default:
break;
}
float minY = Math.min(posY, mainView.getY());
lp = bottomBorder.getLayoutParams();
lp.height = (int)(view.getHeight() - minY - menuFullHeight) + 10;
if (lp.height < 0)
lp.height = 0;
bottomBorder.setLayoutParams(lp);
bottomBorder.requestLayout();
float posY = view.getHeight() - mainViewHeight;
if (mainView.getY() != posY) {
mainView.animate().y(posY).setDuration(200).setInterpolator(new DecelerateInterpolator()).start();
bottomBorder.animate().y(posY + menuFullHeight).setDuration(200).setInterpolator(new DecelerateInterpolator()).start();
}
// OnClick event
if (isClick(endX, endY)) {
OsmandMapTileView mapView = getMapActivity().getMapView();
mapView.getAnimatedDraggingThread().startMoving(getCtxMenu().getPointDescription().getLat(), getCtxMenu().getPointDescription().getLon(),
mapView.getZoom(), true);
}
break;
}
return true;
}
};
View topView = view.findViewById(R.id.context_menu_top_view);
topView.setOnTouchListener(slideTouchListener);
View topShadowView = view.findViewById(R.id.context_menu_top_shadow);
topShadowView.setOnTouchListener(slideTouchListener);
View topShadowAllView = view.findViewById(R.id.context_menu_top_shadow_all);
topShadowAllView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getY() <= dpToPx(SHADOW_HEIGHT_TOP_DP) || event.getAction() != MotionEvent.ACTION_DOWN)
return slideTouchListener.onTouch(v, event);
else
return false;
}
});
// Left icon
IconsCache iconsCache = getMyApplication().getIconsCache();
boolean light = getMyApplication().getSettings().isLightContent();
int iconId = MapContextMenu.getInstance().getLeftIconId();
int iconId = getCtxMenu().getLeftIconId();
final View iconLayout = view.findViewById(R.id.context_menu_icon_layout);
final ImageView iconView = (ImageView)view.findViewById(R.id.context_menu_icon_view);
@ -138,25 +297,25 @@ public class MapContextMenuFragment extends Fragment {
iconLayout.setVisibility(View.GONE);
} else {
iconView.setImageDrawable(iconsCache.getIcon(iconId,
light ? R.color.icon_color : R.color.icon_color_light));
light ? R.color.osmand_orange : R.color.osmand_orange_dark));
}
// Text line 1
TextView line1 = (TextView) view.findViewById(R.id.context_menu_line1);
line1.setText(MapContextMenu.getInstance().getAddressStr());
line1.setText(getCtxMenu().getAddressStr());
// Text line 2
TextView line2 = (TextView) view.findViewById(R.id.context_menu_line2);
line2.setText(MapContextMenu.getInstance().getLocationStr());
line2.setText(getCtxMenu().getLocationStr(getMapActivity()));
// Close button
final ImageView closeButtonView = (ImageView)view.findViewById(R.id.context_menu_close_btn_view);
closeButtonView.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_remove_dark,
light ? R.color.actionbar_dark_color : R.color.actionbar_light_color));
light ? R.color.icon_color_light : R.color.dash_search_icon_dark));
closeButtonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MapActivity)getActivity()).getMapLayers().getContextMenuLayer().hideMapContextMenuMarker();
((MapActivity) getActivity()).getMapLayers().getContextMenuLayer().hideMapContextMenuMarker();
dismissMenu();
}
});
@ -164,93 +323,109 @@ public class MapContextMenuFragment extends Fragment {
// Action buttons
final ImageButton buttonNavigate = (ImageButton) view.findViewById(R.id.context_menu_route_button);
buttonNavigate.setImageDrawable(iconsCache.getIcon(R.drawable.map_directions,
light ? R.color.actionbar_dark_color : R.color.actionbar_light_color));
light ? R.color.icon_color : R.color.dash_search_icon_dark));
buttonNavigate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapContextMenu.getInstance().buttonNavigatePressed();
getCtxMenu().buttonNavigatePressed(getMapActivity());
}
});
final ImageButton buttonFavorite = (ImageButton) view.findViewById(R.id.context_menu_fav_button);
buttonFavorite.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_fav_dark,
light ? R.color.actionbar_dark_color : R.color.actionbar_light_color));
light ? R.color.icon_color : R.color.dash_search_icon_dark));
buttonFavorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapContextMenu.getInstance().buttonFavoritePressed();
getCtxMenu().buttonFavoritePressed(getMapActivity());
}
});
final ImageButton buttonShare = (ImageButton) view.findViewById(R.id.context_menu_share_button);
buttonShare.setImageDrawable(iconsCache.getIcon(R.drawable.abc_ic_menu_share_mtrl_alpha,
light ? R.color.actionbar_dark_color : R.color.actionbar_light_color));
light ? R.color.icon_color : R.color.dash_search_icon_dark));
buttonShare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapContextMenu.getInstance().buttonSharePressed();
getCtxMenu().buttonSharePressed(getMapActivity());
}
});
final ImageButton buttonMore = (ImageButton) view.findViewById(R.id.context_menu_more_button);
buttonMore.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_core_overflow_dark,
light ? R.color.actionbar_dark_color : R.color.actionbar_light_color));
buttonMore.setImageDrawable(iconsCache.getIcon(R.drawable.ic_overflow_menu_white,
light ? R.color.icon_color : R.color.dash_search_icon_dark));
buttonMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MapContextMenu.getInstance().buttonMorePressed();
getCtxMenu().buttonMorePressed(getMapActivity());
}
});
// Bottom view
BottomSectionBuilder bottomSectionBuilder = MapContextMenu.getInstance().getBottomSectionBuilder();
if (bottomSectionBuilder != null) {
View bottomView = view.findViewById(R.id.context_menu_bottom_view);
bottomSectionBuilder.buildSection(bottomView);
}
/*
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
toolbar.setTitle(R.string.poi_create_title);
toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
fragmentManager.beginTransaction().remove(MapContextMenuFragment.this).commit();
fragmentManager.popBackStack();
}
});
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
String basicTitle = getResources().getString(R.string.tab_title_basic);
String extendedTitle = getResources().getString(R.string.tab_title_advanced);
MyAdapter pagerAdapter = new MyAdapter(getChildFragmentManager(), basicTitle, extendedTitle);
viewPager.setAdapter(pagerAdapter);
final TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
// Hack due to bug in design support library v22.2.1
// https://code.google.com/p/android/issues/detail?id=180462
// TODO remove in new version
if (ViewCompat.isLaidOut(tabLayout)) {
tabLayout.setupWithViewPager(viewPager);
} else {
tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
// Menu controller
menuController = getCtxMenu().getMenuController();
bottomView = view.findViewById(R.id.context_menu_bottom_view);
if (menuController != null) {
bottomView.setOnTouchListener(new View.OnTouchListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
tabLayout.setupWithViewPager(viewPager);
tabLayout.removeOnLayoutChangeListener(this);
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
menuController.build(bottomView);
}
*/
return view;
}
private void doLayoutMenu() {
int shadowViewHeight = 0;
int bottomBorderHeight = 0;
int menuState;
if (menuController != null)
menuState = menuController.getCurrentMenuState();
else
menuState = MenuController.MenuState.HEADER_ONLY;
switch (menuState) {
case MenuController.MenuState.HEADER_ONLY:
shadowViewHeight = view.getHeight() - (menuFullHeight - menuBottomViewHeight) + dpToPx(SHADOW_HEIGHT_BOTTOM_DP);
bottomBorderHeight = 0;
break;
case MenuController.MenuState.HALF_SCREEN:
int maxHeight = (int)(menuController.getHalfScreenMaxHeightKoef() * view.getHeight());
if (maxHeight > menuFullHeight) {
shadowViewHeight = view.getHeight() - menuFullHeight;
bottomBorderHeight = 0;
} else {
shadowViewHeight = view.getHeight() - maxHeight;
bottomBorderHeight = 0;
mainView.setY(shadowViewHeight);
}
break;
case MenuController.MenuState.FULL_SCREEN:
shadowViewHeight = 0;
bottomBorderHeight = view.getHeight() - menuFullHeight + menuTopShadowHeight + dpToPx(SHADOW_HEIGHT_TOP_DP);
break;
default:
break;
}
ViewGroup.LayoutParams lp = bottomBorder.getLayoutParams();
lp.height = bottomBorderHeight + 10;
bottomBorder.setLayoutParams(lp);
bottomBorder.setY(view.getHeight() - bottomBorderHeight);
lp = shadowView.getLayoutParams();
lp.height = shadowViewHeight;
shadowView.setLayoutParams(lp);
lp = mainView.getLayoutParams();
lp.height = menuFullHeight;
mainView.setLayoutParams(lp);
}
public void dismissMenu() {
getActivity().getSupportFragmentManager().popBackStack();
}
@ -269,5 +444,29 @@ public class MapContextMenuFragment extends Fragment {
.add(R.id.fragmentContainer, fragment, "MapContextMenuFragment")
.addToBackStack(null).commit();
}
private MapContextMenu getCtxMenu() {
return getMapActivity().getContextMenu();
}
private MapActivity getMapActivity() {
return (MapActivity)getActivity();
}
// Utils
private int getScreenHeight() {
DisplayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
private int dpToPx(float dp) {
Resources r = getActivity().getResources();
return (int) TypedValue.applyDimension(
COMPLEX_UNIT_DIP,
dp,
r.getDisplayMetrics()
);
}
}

View file

@ -0,0 +1,152 @@
package net.osmand.plus.mapcontextmenu.sections;
import android.content.res.Resources;
import android.text.util.Linkify;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.osmand.data.Amenity;
import net.osmand.osm.AbstractPoiType;
import net.osmand.osm.MapPoiTypes;
import net.osmand.osm.PoiType;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.util.Algorithms;
import java.util.Map;
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
public class AmenityInfoMenuBuilder extends MenuBuilder {
private final Amenity amenity;
public AmenityInfoMenuBuilder(OsmandApplication app, final Amenity amenity) {
super(app);
this.amenity = amenity;
}
private void buildRow(View view, int iconId, String text, boolean firstRow) {
boolean light = app.getSettings().isLightContent();
LinearLayout ll = new LinearLayout(view.getContext());
ll.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) ;
//llParams.setMargins(0, dpToPx(14f), 0, dpToPx(14f));
ll.setLayoutParams(llParams);
// Icon
LinearLayout llIcon = new LinearLayout(view.getContext());
llIcon.setOrientation(LinearLayout.HORIZONTAL);
llIcon.setLayoutParams(new LinearLayout.LayoutParams(dpToPx(72f), firstRow ? dpToPx(48f) - dpToPx(SHADOW_HEIGHT_BOTTOM_DP) : dpToPx(48f)));
llIcon.setGravity(Gravity.CENTER_VERTICAL);
ll.addView(llIcon);
ImageView icon = new ImageView(view.getContext());
LinearLayout.LayoutParams llIconParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) ;
llIconParams.setMargins(dpToPx(16f), firstRow ? dpToPx(12f) - dpToPx(SHADOW_HEIGHT_BOTTOM_DP / 2f) : dpToPx(12f), dpToPx(32f), dpToPx(12f));
llIconParams.gravity = Gravity.CENTER_VERTICAL;
icon.setLayoutParams(llIconParams);
icon.setScaleType(ImageView.ScaleType.CENTER);
icon.setImageDrawable(getRowIcon(iconId));
llIcon.addView(icon);
// Text
LinearLayout llText = new LinearLayout(view.getContext());
llText.setOrientation(LinearLayout.VERTICAL);
ll.addView(llText);
TextView textView = new TextView(view.getContext());
LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
llTextParams.setMargins(0, firstRow ? dpToPx(8f) - dpToPx(SHADOW_HEIGHT_BOTTOM_DP) : dpToPx(8f), 0, dpToPx(8f));
textView.setLayoutParams(llTextParams);
textView.setTextSize(16); // todo: create constant
textView.setTextColor(app.getResources().getColor(light ? R.color.ctx_menu_info_text_light : R.color.ctx_menu_info_text_dark));
//text = "http://ru.wikipedia.org/wiki/Храм Святого Розария (Владимир)";
//SpannableString spannable = new SpannableString(text);
//Linkify.addLinks(spannable, Linkify.ALL);
//textView.setClickable(true);
//textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setAutoLinkMask(Linkify.ALL);
//textView.setSingleLine();
textView.setLinksClickable(true);
textView.setText(text);
//textView.setText("sdf dsaf fsdasdfg adsf asdsfd asdf sdf adsfg asdf sdfa sdf dsf agsfdgd fgsfd sdf asdf adg adf sdf asdf dfgdfsg sdfg adsf asdf asdf sdf SDF ASDF ADSF ASDF ASDF DAF SDAF dfg dsfg dfg sdfg rg rth sfghs dfgs dfgsdfg adfg dfg sdfg dfs ");
LinearLayout.LayoutParams llTextViewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
llTextViewParams.setMargins(0, 0, dpToPx(10f), 0);
llTextViewParams.gravity = Gravity.CENTER_VERTICAL;
llText.setLayoutParams(llTextViewParams);
llText.addView(textView);
((LinearLayout)view).addView(ll);
View horizontalLine = new View(view.getContext());
LinearLayout.LayoutParams llHorLineParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dpToPx(1f));
llHorLineParams.gravity = Gravity.BOTTOM;
horizontalLine.setLayoutParams(llHorLineParams);
horizontalLine.setBackgroundColor(app.getResources().getColor(light ? R.color.ctx_menu_info_divider_light : R.color.ctx_menu_info_divider_dark));
((LinearLayout)view).addView(horizontalLine);
}
public int dpToPx(float dp) {
Resources r = app.getResources();
return (int) TypedValue.applyDimension(
COMPLEX_UNIT_DIP,
dp,
r.getDisplayMetrics()
);
}
@Override
public void build(View view) {
boolean firstRow = true;
MapPoiTypes poiTypes = app.getPoiTypes();
for(Map.Entry<String, String> e : amenity.getAdditionalInfo().entrySet()) {
int iconId;
String key = e.getKey();
String vl = e.getValue();
if(key.startsWith("name:")) {
continue;
} else if(Amenity.OPENING_HOURS.equals(key)) {
iconId = R.drawable.ic_action_time;
} else if(Amenity.PHONE.equals(key)) {
iconId = R.drawable.ic_action_call_dark;
} else if(Amenity.WEBSITE.equals(key)) {
iconId = R.drawable.ic_world_globe_dark;
} else {
if (Amenity.DESCRIPTION.equals(key)) {
iconId = R.drawable.ic_action_note_dark;
} else {
iconId = R.drawable.ic_action_info_dark;
}
AbstractPoiType pt = poiTypes.getAnyPoiAdditionalTypeByKey(e.getKey());
if (pt != null) {
if(pt instanceof PoiType && !((PoiType) pt).isText()) {
vl = pt.getTranslation();
} else {
vl = pt.getTranslation() + ": " + amenity.unzipContent(e.getValue());
}
} else {
vl = Algorithms.capitalizeFirstLetterAndLowercase(e.getKey()) +
": " + amenity.unzipContent(e.getValue());
}
}
buildRow(view, iconId, vl, firstRow);
firstRow = false;
}
}
}

View file

@ -0,0 +1,17 @@
package net.osmand.plus.mapcontextmenu.sections;
import net.osmand.data.Amenity;
import net.osmand.plus.OsmandApplication;
public class AmenityInfoMenuController extends MenuController {
public AmenityInfoMenuController(OsmandApplication app, final Amenity amenity) {
super(new AmenityInfoMenuBuilder(app, amenity));
}
@Override
public int getSupportedMenuStates() {
return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN;
}
}

View file

@ -1,4 +1,4 @@
package net.osmand.plus.mapcontextmenu;
package net.osmand.plus.mapcontextmenu.sections;
import android.graphics.drawable.Drawable;
import android.view.View;
@ -7,15 +7,18 @@ import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
public abstract class BottomSectionBuilder {
public abstract class MenuBuilder {
public static final float SHADOW_HEIGHT_TOP_DP = 16f;
public static final float SHADOW_HEIGHT_BOTTOM_DP = 6f;
protected OsmandApplication app;
public BottomSectionBuilder(OsmandApplication app) {
public MenuBuilder(OsmandApplication app) {
this.app = app;
}
public abstract void buildSection(View view);
public abstract void build(View view);
public Drawable getRowIcon(int iconId) {
IconsCache iconsCache = app.getIconsCache();

View file

@ -0,0 +1,72 @@
package net.osmand.plus.mapcontextmenu.sections;
import android.view.View;
public abstract class MenuController {
public class MenuState {
public static final int HEADER_ONLY = 1;
public static final int HALF_SCREEN = 2;
public static final int FULL_SCREEN = 4;
}
private MenuBuilder builder;
private int currentMenuState;
public MenuController(MenuBuilder builder) {
this.builder = builder;
this.currentMenuState = getInitialMenuState();
}
public void build(View rootView) {
builder.build(rootView);
}
public int getInitialMenuState() {
return MenuState.HEADER_ONLY;
}
public int getSupportedMenuStates() {
return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN;
}
public int getCurrentMenuState() {
return currentMenuState;
}
public boolean slideUp() {
int v = currentMenuState;
for (int i = 0; i < 2; i++) {
v = v << 1;
if ((v & getSupportedMenuStates()) != 0) {
currentMenuState = v;
return true;
}
}
return false;
}
public boolean slideDown() {
int v = currentMenuState;
for (int i = 0; i < 2; i++) {
v = v >> 1;
if ((v & getSupportedMenuStates()) != 0) {
currentMenuState = v;
return true;
}
}
return false;
}
public void setCurrentMenuState(int currentMenuState) {
this.currentMenuState = currentMenuState;
}
public float getHalfScreenMaxHeightKoef() {
return .6f;
}
public boolean shouldShowButtons() {
return true;
}
}

View file

@ -45,6 +45,8 @@ import net.osmand.plus.views.OsmandMapLayer.DrawSettings;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.mapwidgets.TextInfoWidget;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import gnu.trove.list.array.TIntArrayList;
@ -325,6 +327,11 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
SavingTrackHelper helper = app.getSavingTrackHelper();
helper.saveDataToGpx(app.getAppCustomization().getTracksDir());
helper.close();
DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(app);
final String formattedTime =
timeFormat.format(new Date(helper.getLastTimeUpdated()));
showNotification(app, String.format(app.getString(R.string.saved_at_time),
formattedTime));
} finally {
isSaving = false;
}
@ -345,7 +352,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
}
}
public void startGPXMonitoring(Activity map) {
public void startGPXMonitoring(final Activity map) {
final ValueHolder<Integer> vs = new ValueHolder<Integer>();
final ValueHolder<Boolean> choice = new ValueHolder<Boolean>();
vs.value = settings.SAVE_GLOBAL_TRACK_INTERVAL.get();
@ -365,6 +372,10 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
}
app.startNavigationService(NavigationService.USED_BY_GPX);
showNotification(map, null);
}
};
if(choice.value) {
@ -379,38 +390,32 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
}
});
}
}
String stop = map.getResources().getString(R.string.shared_string_control_stop);
private static void showNotification(Context context, String contentText) {
String stop = context.getResources().getString(R.string.shared_string_control_stop);
Intent stopIntent = new Intent(NavigationService.OSMAND_STOP_SERVICE_ACTION);
PendingIntent stopPendingIntent = PendingIntent.getBroadcast(map, 0, stopIntent,
PendingIntent stopPendingIntent = PendingIntent.getBroadcast(context, 0, stopIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
String save = map.getResources().getString(R.string.shared_string_save);
String save = context.getResources().getString(R.string.shared_string_save);
Intent saveIntent = new Intent(OSMAND_SAVE_SERVICE_ACTION);
PendingIntent savePendingIntent = PendingIntent.getBroadcast(map, 0, saveIntent,
PendingIntent savePendingIntent = PendingIntent.getBroadcast(context, 0, saveIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
BroadcastReceiver saveBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final OsmandMonitoringPlugin plugin = OsmandPlugin
.getEnabledPlugin(OsmandMonitoringPlugin.class);
if (plugin != null) {
plugin.saveCurrentTrack();
}
}
};
map.registerReceiver(saveBroadcastReceiver, new IntentFilter(OSMAND_SAVE_SERVICE_ACTION));
BroadcastReceiver saveBroadcastReceiver = new SaveBroadcastReceiver();
context.registerReceiver(saveBroadcastReceiver, new IntentFilter(OSMAND_SAVE_SERVICE_ACTION));
final NotificationCompat.Builder notificationBuilder =
new android.support.v7.app.NotificationCompat.Builder(map)
.setContentTitle(map.getResources().getString(R.string.map_widget_monitoring))
.setSmallIcon(R.drawable.ic_action_polygom_dark)
new android.support.v7.app.NotificationCompat.Builder(context)
.setContentTitle(context.getResources().getString(R.string.map_widget_monitoring))
.setContentText(contentText)
.setSmallIcon(R.drawable.ic_action_polygom_dark)
// .setLargeIcon(Helpers.getBitmap(R.drawable.mirakel, getBaseContext()))
.setOngoing(true)
.addAction(R.drawable.ic_action_rec_stop, stop, stopPendingIntent)
.addAction(R.drawable.ic_action_save, save, savePendingIntent);
.setOngoing(true)
.addAction(R.drawable.ic_action_rec_stop, stop, stopPendingIntent)
.addAction(R.drawable.ic_action_save, save, savePendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) map.getSystemService(Context.NOTIFICATION_SERVICE);
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notificationId, notificationBuilder.build());
}
@ -513,4 +518,15 @@ public class OsmandMonitoringPlugin extends OsmandPlugin {
return new DashFragmentData(DashTrackFragment.TAG, DashTrackFragment.class,
R.string.record_plugin_name, 11);
}
private static class SaveBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final OsmandMonitoringPlugin plugin = OsmandPlugin
.getEnabledPlugin(OsmandMonitoringPlugin.class);
if (plugin != null) {
plugin.saveCurrentTrack();
}
}
}
}

View file

@ -2,6 +2,7 @@ package net.osmand.plus.osmedit;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
@ -9,6 +10,7 @@ import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -54,9 +56,15 @@ public class AdvancedDataFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_edit_poi_advanced, container, false);
Display display = getActivity().getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int height = size.y;
view.findViewById(R.id.screenFiller).setMinimumHeight(height);
deleteDrawable = ((OsmandApplication) getActivity().getApplication()).getIconsCache()
.getPaintedContentIcon(R.drawable.ic_action_remove_dark,
getActivity().getResources().getColor(R.color.icon_color_light));
getActivity().getResources().getColor(R.color.dash_search_icon_dark));
TextView nameTextView = (TextView) view.findViewById(R.id.nameTextView);
TextView amenityTagTextView = (TextView) view.findViewById(R.id.amenityTagTextView);
TextView amenityTextView = (TextView) view.findViewById(R.id.amenityTextView);
@ -205,7 +213,7 @@ public class AdvancedDataFragment extends Fragment {
editPoiData.notifyDatasetChanged(mTagsChangedListener);
}
});
final Set<String> tagKeys = new TreeSet<String>();
final Set<String> tagKeys = new TreeSet<>();
for (OSMSettings.OSMTagKey t : OSMSettings.OSMTagKey.values()) {
if ((t != OSMSettings.OSMTagKey.NAME) && (t != OSMSettings.OSMTagKey.OPENING_HOURS) && (t != OSMSettings.OSMTagKey.PHONE)
&& (t != OSMSettings.OSMTagKey.WEBSITE)) {
@ -213,7 +221,7 @@ public class AdvancedDataFragment extends Fragment {
}
}
ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(linearLayout.getContext(),
ArrayAdapter<Object> adapter = new ArrayAdapter<>(linearLayout.getContext(),
R.layout.list_textview, tagKeys.toArray());
tagEditText.setAdapter(adapter);
tagEditText.setThreshold(1);

View file

@ -1,5 +1,6 @@
package net.osmand.plus.osmedit;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
@ -7,6 +8,7 @@ import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -52,21 +54,35 @@ public class BasicDataFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
IconsCache iconsCache = ((OsmandApplication) getActivity().getApplication()).getIconsCache();
View view = inflater.inflate(R.layout.fragment_edit_poi_normal, container, false);
Display display = getActivity().getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int height = size.y;
view.findViewById(R.id.screenFiller).setMinimumHeight(height);
IconsCache iconsCache = getMyApplication().getIconsCache();
int iconColor = getResources().getColor(R.color.dash_search_icon_dark);
ImageView streetImageView = (ImageView) view.findViewById(R.id.streetImageView);
streetImageView.setImageDrawable(iconsCache.getContentIcon(R.drawable.ic_action_street_name));
streetImageView.setImageDrawable(
iconsCache.getPaintedContentIcon(R.drawable.ic_action_street_name, iconColor));
ImageView houseNumberImageView = (ImageView) view.findViewById(R.id.houseNumberImageView);
houseNumberImageView.setImageDrawable(iconsCache.getContentIcon(R.drawable.ic_action_building_number));
houseNumberImageView.setImageDrawable(
iconsCache.getPaintedContentIcon(R.drawable.ic_action_building_number, iconColor));
ImageView phoneImageView = (ImageView) view.findViewById(R.id.phoneImageView);
phoneImageView.setImageDrawable(iconsCache.getContentIcon(R.drawable.ic_action_call_dark));
phoneImageView.setImageDrawable(
iconsCache.getPaintedContentIcon(R.drawable.ic_action_call_dark, iconColor));
ImageView webSiteImageView = (ImageView) view.findViewById(R.id.webSiteImageView);
webSiteImageView.setImageDrawable(iconsCache.getContentIcon(R.drawable.ic_world_globe_dark));
webSiteImageView.setImageDrawable(
iconsCache.getPaintedContentIcon(R.drawable.ic_world_globe_dark, iconColor));
ImageView descriptionImageView = (ImageView) view.findViewById(R.id.descriptionImageView);
descriptionImageView.setImageDrawable(iconsCache.getContentIcon(R.drawable.ic_action_description));
descriptionImageView.setImageDrawable(
iconsCache.getPaintedContentIcon(R.drawable.ic_action_description, iconColor));
ImageView openingHoursImageView = (ImageView) view.findViewById(R.id.openingHoursImageView);
openingHoursImageView.setImageDrawable(iconsCache.getContentIcon(R.drawable.ic_action_time));
openingHoursImageView.setImageDrawable(
iconsCache.getPaintedContentIcon(R.drawable.ic_action_time, iconColor));
streetEditText = (EditText) view.findViewById(R.id.streetEditText);
streetEditText.addTextChangedListener(new MyOnFocusChangeListener(getData(),
@ -96,10 +112,10 @@ public class BasicDataFragment extends Fragment {
}
});
LinearLayout openHoursContainer = (LinearLayout) view.findViewById(R.id.openHoursContainer);
Drawable clockDrawable = iconsCache.getContentIcon(R.drawable.ic_action_time);
Drawable clockDrawable = iconsCache
.getPaintedContentIcon(R.drawable.ic_action_time, iconColor);
Drawable deleteDrawable = iconsCache
.getPaintedContentIcon(R.drawable.ic_action_remove_dark,
getActivity().getResources().getColor(R.color.icon_color_light));
.getPaintedContentIcon(R.drawable.ic_action_remove_dark, iconColor);
if (savedInstanceState != null && savedInstanceState.containsKey(OPENING_HOURS)) {
mOpeningHoursAdapter = new OpeningHoursAdapter(
(OpeningHoursParser.OpeningHours) savedInstanceState.getSerializable(OPENING_HOURS),
@ -112,6 +128,10 @@ public class BasicDataFragment extends Fragment {
return view;
}
private OsmandApplication getMyApplication() {
return (OsmandApplication) getActivity().getApplication();
}
@Override
public void onResume() {
super.onResume();

View file

@ -27,6 +27,7 @@ import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
@ -117,6 +118,10 @@ public class EditPoiFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_edit_poi, container, false);
final OsmandSettings settings = getMyApplication().getSettings();
boolean isLightTheme = settings.OSMAND_THEME.get() == settings.OSMAND_LIGHT_THEME;
if (savedInstanceState != null) {
editPoiData.tags = (LinkedHashSet<Tag>) savedInstanceState.getSerializable(TAGS_LIST);
} else {
@ -151,17 +156,13 @@ public class EditPoiFragment extends DialogFragment {
editPoiData.tags.add(tag);
}
View view = inflater.inflate(R.layout.fragment_edit_poi, container, false);
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
toolbar.setTitle(R.string.poi_create_title);
toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
fragmentManager.beginTransaction().remove(EditPoiFragment.this).commit();
fragmentManager.popBackStack();
dismiss();
}
});
@ -202,7 +203,9 @@ public class EditPoiFragment extends DialogFragment {
onlineDocumentationButton.setImageDrawable(
getMyApplication().getIconsCache()
.getPaintedContentIcon(R.drawable.ic_action_help,
getResources().getColor(R.color.inactive_item_orange)));
getResources().getColor(
isLightTheme ? R.color.dash_search_icon_dark
: R.color.inactive_item_orange)));
final ImageButton poiTypeButton = (ImageButton) view.findViewById(R.id.poiTypeButton);
poiTypeButton.setOnClickListener(new View.OnClickListener() {
@Override
@ -254,14 +257,25 @@ public class EditPoiFragment extends DialogFragment {
}
}
});
poiTypeEditText.setOnClickListener(new View.OnClickListener() {
poiTypeEditText.setOnTouchListener(new View.OnTouchListener() {
@Override
public void onClick(View v) {
if (poiTypeEditText.getText().length() == 0 && editPoiData.amenity.getType() != null) {
DialogFragment dialogFragment =
PoiSubTypeDialogFragment.createInstance(editPoiData.amenity);
dialogFragment.show(getChildFragmentManager(), "PoiSubTypeDialogFragment");
public boolean onTouch(final View v, MotionEvent event) {
final EditText editText = (EditText) v;
final int DRAWABLE_RIGHT = 2;
if (event.getAction() == MotionEvent.ACTION_UP) {
if (event.getX() >= (editText.getRight()
- editText.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width()
- editText.getPaddingRight())) {
if (editPoiData.amenity.getType() != null) {
DialogFragment dialogFragment =
PoiSubTypeDialogFragment.createInstance(editPoiData.amenity);
dialogFragment.show(getChildFragmentManager(), "PoiSubTypeDialogFragment");
}
return true;
}
}
return false;
}
});
@ -325,11 +339,7 @@ public class EditPoiFragment extends DialogFragment {
if (getActivity() instanceof MapActivity) {
((MapActivity) getActivity()).getMapView().refreshMap(true);
}
FragmentManager fragmentManager =
getActivity().getSupportFragmentManager();
fragmentManager.beginTransaction().remove(EditPoiFragment.this)
.commit();
fragmentManager.popBackStack();
dismiss();
}
}, getActivity(), mOpenstreetmapUtil);
@ -515,9 +525,7 @@ public class EditPoiFragment extends DialogFragment {
if (n != null) {
EditPoiFragment fragment =
EditPoiFragment.createInstance(n, amenity);
activity.getSupportFragmentManager().beginTransaction()
.add(R.id.fragmentContainer, fragment, "EditPoiFragment")
.addToBackStack(null).commit();
fragment.show(activity.getSupportFragmentManager(), TAG);
} else {
AccessibleToast.makeText(activity,
activity.getString(R.string.poi_error_poi_not_found),

View file

@ -20,9 +20,6 @@ import net.osmand.plus.osmedit.OpenstreetmapUtil;
import net.osmand.plus.osmedit.OsmEditingPlugin;
import net.osmand.plus.osmedit.OsmPoint;
/**
* Created by GaidamakUA on 8/28/15.
*/
public class DeletePoiDialogFragment extends DialogFragment {
private static final String KEY_AMENITY_NODE = "amenity_node";
@ -37,7 +34,7 @@ public class DeletePoiDialogFragment extends DialogFragment {
final Bundle args = getArguments();
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(R.string.poi_remove_title);;
builder.setTitle(R.string.poi_remove_title);
builder.setNegativeButton(R.string.shared_string_cancel, null);
builder.setPositiveButton(R.string.shared_string_delete, new DialogInterface.OnClickListener() {
@Override
@ -48,7 +45,8 @@ public class DeletePoiDialogFragment extends DialogFragment {
new Runnable() {
@Override
public void run() {
AccessibleToast.makeText(activity, R.string.poi_remove_success,
AccessibleToast.makeText(activity,
getString(R.string.poi_deleted_localy),
Toast.LENGTH_LONG).show();
if (activity instanceof MapActivity) {
((MapActivity) activity).getMapView().refreshMap(true);

View file

@ -23,14 +23,12 @@ import net.osmand.data.RotatedTileBox;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
public class ContextMenuLayer extends OsmandMapLayer {
@ -65,6 +63,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
private String description;
private Map<Object, IContextMenuProvider> selectedObjects = new ConcurrentHashMap<Object, IContextMenuProvider>();
private Object selectedObj;
private IContextMenuProvider contextObject;
private TextView textView;
private ImageView closeButton;
@ -274,7 +273,8 @@ public class ContextMenuLayer extends OsmandMapLayer {
if (selectedObjects.size() == 1) {
setLocation(null, "");
selectedObj = selectedObjects.keySet().iterator().next();
showMapContextMenu(selectedObj, latLon);
contextObject = selectedObjects.get(selectedObj);
showMapContextMenu(latLon);
} else if (selectedObjects.size() > 1) {
showContextMenuForSelectedObjects(latLon);
}
@ -282,7 +282,9 @@ public class ContextMenuLayer extends OsmandMapLayer {
setLocation(null, "");
final double lat = tileBox.getLatFromPixel((int) point.x, (int) point.y);
final double lon = tileBox.getLonFromPixel((int) point.x, (int) point.y);
showMapContextMenu(null, new LatLon(lat, lon));
selectedObj = null;
contextObject = null;
showMapContextMenu(new LatLon(lat, lon));
//setLocation(new LatLon(lat, lon), null);
}
view.refreshMap();
@ -424,7 +426,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
@Override
public boolean onSingleTap(PointF point, RotatedTileBox tileBox) {
if (pressedContextMarker(tileBox, point.x, point.y)) {
showMapContextMenu(selectedObj, latLon);
showMapContextMenu(latLon);
return true;
}
@ -455,7 +457,8 @@ public class ContextMenuLayer extends OsmandMapLayer {
if (selectedObjects.size() == 1) {
setLocation(null, "");
selectedObj = selectedObjects.keySet().iterator().next();
showMapContextMenu(selectedObj, latLon);
contextObject = selectedObjects.get(selectedObj);
showMapContextMenu(latLon);
} else if (selectedObjects.size() > 1) {
showContextMenuForSelectedObjects(latLon);
return true;
@ -482,22 +485,23 @@ public class ContextMenuLayer extends OsmandMapLayer {
@Override
public void onClick(DialogInterface dialog, int which) {
selectedObj = s.get(which);
showMapContextMenu(selectedObj, l);
contextObject = selectedObjects.get(selectedObj);
showMapContextMenu(l);
}
});
builder.show();
} else {
selectedObj = selectedObjects.keySet().iterator().next();
showMapContextMenu(selectedObj, l);
contextObject = selectedObjects.get(selectedObj);
showMapContextMenu(l);
}
}
private void showMapContextMenu(Object obj, LatLon latLon) {
private void showMapContextMenu(LatLon latLon) {
PointDescription pointDescription;
if (obj != null) {
IContextMenuProvider typedObj = selectedObjects.get(obj);
pointDescription = typedObj.getObjectName(obj);
LatLon objLocation = typedObj.getObjectLocation(obj);
if (selectedObj != null && contextObject != null) {
pointDescription = contextObject.getObjectName(selectedObj);
LatLon objLocation = contextObject.getObjectLocation(selectedObj);
pointDescription.setLat(objLocation.getLatitude());
pointDescription.setLon(objLocation.getLongitude());
} else {
@ -506,7 +510,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
this.latLon = new LatLon(pointDescription.getLat(), pointDescription.getLon());
showMapContextMenuMarker();
MapContextMenu.getInstance().show(pointDescription, obj);
activity.getContextMenu().show(activity, pointDescription, selectedObj);
}

View file

@ -920,7 +920,7 @@ public class MapControlsLayer extends OsmandMapLayer {
final OsmandSettings.OsmandPreference<Float> mapDensity = view.getSettings().MAP_DENSITY;
final AlertDialog.Builder bld = new AlertDialog.Builder(view.getContext());
int p = (int) (mapDensity.get() * 100);
final TIntArrayList tlist = new TIntArrayList(new int[] { 33, 50, 75, 100, 150, 200, 300, 400 });
final TIntArrayList tlist = new TIntArrayList(new int[] { 20, 25, 33, 50, 75, 100, 150, 200, 300, 400 });
final List<String> values = new ArrayList<String>();
int i = -1;
for (int k = 0; k <= tlist.size(); k++) {

View file

@ -70,7 +70,7 @@ public class PointLocationLayer extends OsmandMapLayer {
private RectF getHeadingRect(int locationX, int locationY){
int rad = (int) (view.getDensity() * 35);
int rad = (int) (view.getDensity() * 60);
return new RectF(locationX - rad, locationY - rad, locationX + rad, locationY + rad);
}

View file

@ -4,6 +4,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
@ -11,6 +12,7 @@ import java.util.List;
import net.osmand.IndexConstants;
import net.osmand.PlatformUtil;
import net.osmand.StateChangedListener;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
@ -31,7 +33,7 @@ import alice.tuprolog.Term;
import alice.tuprolog.Theory;
import alice.tuprolog.Var;
public abstract class AbstractPrologCommandPlayer implements CommandPlayer {
public abstract class AbstractPrologCommandPlayer implements CommandPlayer, StateChangedListener<ApplicationMode> {
private static final Log log = PlatformUtil.getLog(AbstractPrologCommandPlayer.class);
@ -56,6 +58,7 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer {
protected int streamType;
private int currentVersion;
protected AbstractPrologCommandPlayer(OsmandApplication ctx, String voiceProvider, String configFile, int[] sortedVoiceVersions)
throws CommandPlayerException
{
@ -91,6 +94,15 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer {
"alice.tuprolog.lib.ISOLibrary"/*, "alice.tuprolog.lib.IOLibrary"*/};
}
@Override
public void stateChanged(ApplicationMode change) {
prologSystem.getTheoryManager().retract(new Struct("appMode", new Var()));
prologSystem.getTheoryManager()
.assertA(
new Struct("appMode", new Struct(ctx.getSettings().APPLICATION_MODE.get().getStringKey()
.toLowerCase())), true, "", true);
}
private void init(String voiceProvider, OsmandSettings settings, String configFile) throws CommandPlayerException {
prologSystem.clearTheory();
voiceDir = null;
@ -123,7 +135,11 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer {
if(m.getParent() != null) {
m = m.getParent();
}
prologSystem.addTheory(new Theory("appMode('"+m.getStringKey().toLowerCase()+"')."));
settings.APPLICATION_MODE.addListener(this);
prologSystem.getTheoryManager()
.assertA(
new Struct("appMode", new Struct(ctx.getSettings().APPLICATION_MODE.get().getStringKey()
.toLowerCase())), true, "", true);
prologSystem.addTheory(new Theory("measure('"+mc.toTTSString()+"')."));
prologSystem.addTheory(new Theory(config));
config.close();
@ -150,6 +166,7 @@ public abstract class AbstractPrologCommandPlayer implements CommandPlayer {
}
}
protected Term solveSimplePredicate(String predicate) {
Term val = null;
Var v = new Var("MyVariable"); //$NON-NLS-1$

View file

@ -6,7 +6,7 @@ dependencies {
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 9

View file

@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 7

View file

@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 9

View file

@ -1,8 +0,0 @@
/*___Generated_by_IDEA___*/
package net.osmand.addressPlugin;
/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */
public final class BuildConfig {
public final static boolean DEBUG = Boolean.parseBoolean(null);
}

View file

@ -1,7 +0,0 @@
/*___Generated_by_IDEA___*/
package net.osmand.addressPlugin;
/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */
public final class Manifest {
}

View file

@ -1,7 +0,0 @@
/*___Generated_by_IDEA___*/
package net.osmand.addressPlugin;
/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */
public final class R {
}

View file

@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
buildToolsVersion "23.0.1"
signingConfigs {
development {

View file

@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
buildToolsVersion "23.0.1"
signingConfigs {
development {

View file

@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
buildToolsVersion "23.0.1"
signingConfigs {
development {

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

View file

@ -1,4 +0,0 @@
bin
gen
raw
obj

View file

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Osmand-Sherpafy</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.osmand.sherpafy"
android:versionCode="6"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="16" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
<supports-screens android:resizeable="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true"
android:xlargeScreens="true" android:anyDensity="true" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:name=".SherpafyPluginActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View file

@ -1,67 +0,0 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
signingConfigs {
development {
storeFile file("../../keystores/debug.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
publishing {
storeFile file("../../osmand_key")
storePassword System.getenv("OSMAND_APK_PASSWORD")
keyAlias "androiddebugkey"
keyPassword System.getenv("OSMAND_APK_PASSWORD")
}
}
defaultConfig {
minSdkVersion 9
targetSdkVersion 21
}
lintOptions {
abortOnError false
}
sourceSets {
main {
manifest.srcFile "AndroidManifest.xml"
jni.srcDirs = []
jniLibs.srcDirs = []
aidl.srcDirs = ["src"]
java.srcDirs = ["src"]
resources.srcDirs = ["src"]
renderscript.srcDirs = ["src"]
res.srcDirs = ["res"]
assets.srcDirs = ["assets"]
}
}
buildTypes {
debug {
signingConfig signingConfigs.development
}
release {
signingConfig signingConfigs.publishing
}
}
}
repositories {
ivy {
name = "OsmAndBinariesIvy"
url = "http://builder.osmand.net"
layout "pattern", {
artifact "ivy/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}
}
}
dependencies {
}

View file

@ -1,20 +0,0 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

Some files were not shown because too many files have changed in this diff Show more