Merge branch 'master' of ssh://github.com/osmandapp/Osmand into Fix_5595

This commit is contained in:
Chumva 2018-07-31 10:41:11 +03:00
commit ab6434f3ba
44 changed files with 801 additions and 117 deletions

View file

@ -53,6 +53,8 @@ import net.osmand.aidl.gpx.RemoveGpxParams;
import net.osmand.aidl.maplayer.point.ShowMapPointParams; import net.osmand.aidl.maplayer.point.ShowMapPointParams;
import net.osmand.aidl.navdrawer.AddOpenAppNavDrawerItemParams;
// NOTE: Add new methods at the end of file!!! // NOTE: Add new methods at the end of file!!!
interface IOsmAndAidlInterface { interface IOsmAndAidlInterface {
@ -105,4 +107,6 @@ interface IOsmAndAidlInterface {
boolean removeGpx(in RemoveGpxParams params); boolean removeGpx(in RemoveGpxParams params);
boolean showMapPoint(in ShowMapPointParams params); boolean showMapPoint(in ShowMapPointParams params);
boolean addOpenAppNavDrawerItem(in AddOpenAppNavDrawerItemParams params);
} }

View file

@ -16,6 +16,14 @@ public class AMapLayer implements Parcelable {
private float zOrder = 5.5f; private float zOrder = 5.5f;
private Map<String, AMapPoint> points = new ConcurrentHashMap<>(); private Map<String, AMapPoint> points = new ConcurrentHashMap<>();
private boolean imagePoints = false;
private int circlePointMinZoom = 0;
private int circlePointMaxZoom = 6;
private int smallPointMinZoom = 7;
private int smallPointMaxZoom = 13;
private int bigPointMinZoom = 14;
private int bigPointMaxZoom = 22;
public AMapLayer(String id, String name, float zOrder, List<AMapPoint> pointList) { public AMapLayer(String id, String name, float zOrder, List<AMapPoint> pointList) {
this.id = id; this.id = id;
this.name = name; this.name = name;
@ -70,11 +78,74 @@ public class AMapLayer implements Parcelable {
points.remove(pointId); points.remove(pointId);
} }
public boolean isImagePoints() {
return imagePoints;
}
public void setImagePoints(boolean imagePoints) {
this.imagePoints = imagePoints;
}
public void copyZoomBounds(AMapLayer layer) {
circlePointMinZoom = layer.circlePointMinZoom;
circlePointMaxZoom = layer.circlePointMaxZoom;
smallPointMinZoom = layer.smallPointMinZoom;
smallPointMaxZoom = layer.smallPointMaxZoom;
bigPointMinZoom = layer.bigPointMinZoom;
bigPointMaxZoom = layer.bigPointMaxZoom;
}
public void setCirclePointZoomBounds(int min, int max) {
circlePointMinZoom = min;
circlePointMaxZoom = max;
}
public void setSmallPointZoomBounds(int min, int max) {
smallPointMinZoom = min;
smallPointMaxZoom = max;
}
public void setBigPointZoomBounds(int min, int max) {
bigPointMinZoom = min;
bigPointMaxZoom = max;
}
public int getCirclePointMinZoom() {
return circlePointMinZoom;
}
public int getCirclePointMaxZoom() {
return circlePointMaxZoom;
}
public int getSmallPointMinZoom() {
return smallPointMinZoom;
}
public int getSmallPointMaxZoom() {
return smallPointMaxZoom;
}
public int getBigPointMinZoom() {
return bigPointMinZoom;
}
public int getBigPointMaxZoom() {
return bigPointMaxZoom;
}
public void writeToParcel(Parcel out, int flags) { public void writeToParcel(Parcel out, int flags) {
out.writeString(id); out.writeString(id);
out.writeString(name); out.writeString(name);
out.writeFloat(zOrder); out.writeFloat(zOrder);
out.writeTypedList(new ArrayList<>(points.values())); out.writeTypedList(new ArrayList<>(points.values()));
out.writeByte((byte) (imagePoints ? 1 : 0));
out.writeInt(circlePointMinZoom);
out.writeInt(circlePointMaxZoom);
out.writeInt(smallPointMinZoom);
out.writeInt(smallPointMaxZoom);
out.writeInt(bigPointMinZoom);
out.writeInt(bigPointMaxZoom);
} }
private void readFromParcel(Parcel in) { private void readFromParcel(Parcel in) {
@ -86,6 +157,13 @@ public class AMapLayer implements Parcelable {
for (AMapPoint p : pointList) { for (AMapPoint p : pointList) {
this.points.put(p.getId(), p); this.points.put(p.getId(), p);
} }
imagePoints = in.readByte() == 1;
circlePointMinZoom = in.readInt();
circlePointMaxZoom = in.readInt();
smallPointMinZoom = in.readInt();
smallPointMaxZoom = in.readInt();
bigPointMinZoom = in.readInt();
bigPointMaxZoom = in.readInt();
} }
public int describeContents() { public int describeContents() {

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.navdrawer;
parcelable AddOpenAppNavDrawerItemParams;

View file

@ -0,0 +1,63 @@
package net.osmand.aidl.navdrawer;
import android.os.Parcel;
import android.os.Parcelable;
public class AddOpenAppNavDrawerItemParams implements Parcelable {
private String itemName;
private String appPackage;
private int flags;
public AddOpenAppNavDrawerItemParams(String itemName, String appPackage) {
this(itemName, appPackage, -1);
}
public AddOpenAppNavDrawerItemParams(String itemName, String appPackage, int flags) {
this.itemName = itemName;
this.appPackage = appPackage;
this.flags = flags;
}
protected AddOpenAppNavDrawerItemParams(Parcel in) {
itemName = in.readString();
appPackage = in.readString();
flags = in.readInt();
}
public String getItemName() {
return itemName;
}
public String getAppPackage() {
return appPackage;
}
public int getFlags() {
return flags;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(itemName);
dest.writeString(appPackage);
dest.writeInt(flags);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<AddOpenAppNavDrawerItemParams> CREATOR = new Creator<AddOpenAppNavDrawerItemParams>() {
@Override
public AddOpenAppNavDrawerItemParams createFromParcel(Parcel in) {
return new AddOpenAppNavDrawerItemParams(in);
}
@Override
public AddOpenAppNavDrawerItemParams[] newArray(int size) {
return new AddOpenAppNavDrawerItemParams[size];
}
};
}

View file

@ -41,6 +41,15 @@ class TelegramApplication : Application(), OsmandHelperListener {
settings = TelegramSettings(this) settings = TelegramSettings(this)
uiUtils = UiUtils(this) uiUtils = UiUtils(this)
osmandAidlHelper = OsmandAidlHelper(this) osmandAidlHelper = OsmandAidlHelper(this)
osmandAidlHelper.listener = object : OsmandAidlHelper.OsmandHelperListener {
override fun onOsmandConnectionStateChanged(connected: Boolean) {
if (connected) {
val basePackage = "net.osmand.telegram"
val appPackage = if (BuildConfig.DEBUG) "$basePackage.debug" else basePackage
osmandAidlHelper.addOpenAppNavDrawerItem(getString(R.string.app_name), appPackage, -1)
}
}
}
shareLocationHelper = ShareLocationHelper(this) shareLocationHelper = ShareLocationHelper(this)
showLocationHelper = ShowLocationHelper(this) showLocationHelper = ShowLocationHelper(this)
notificationHelper = NotificationHelper(this) notificationHelper = NotificationHelper(this)

View file

@ -33,6 +33,7 @@ import net.osmand.aidl.mapwidget.AMapWidget
import net.osmand.aidl.mapwidget.AddMapWidgetParams import net.osmand.aidl.mapwidget.AddMapWidgetParams
import net.osmand.aidl.mapwidget.RemoveMapWidgetParams import net.osmand.aidl.mapwidget.RemoveMapWidgetParams
import net.osmand.aidl.mapwidget.UpdateMapWidgetParams import net.osmand.aidl.mapwidget.UpdateMapWidgetParams
import net.osmand.aidl.navdrawer.AddOpenAppNavDrawerItemParams
import net.osmand.aidl.navigation.NavigateGpxParams import net.osmand.aidl.navigation.NavigateGpxParams
import net.osmand.aidl.navigation.NavigateParams import net.osmand.aidl.navigation.NavigateParams
import net.osmand.aidl.note.StartAudioRecordingParams import net.osmand.aidl.note.StartAudioRecordingParams
@ -474,6 +475,7 @@ class OsmandAidlHelper(private val app: Application) {
if (mIOsmAndAidlInterface != null) { if (mIOsmAndAidlInterface != null) {
try { try {
val layer = AMapLayer(id, name, zOrder, points) val layer = AMapLayer(id, name, zOrder, points)
layer.isImagePoints = true
return mIOsmAndAidlInterface!!.addMapLayer(AddMapLayerParams(layer)) return mIOsmAndAidlInterface!!.addMapLayer(AddMapLayerParams(layer))
} catch (e: RemoteException) { } catch (e: RemoteException) {
e.printStackTrace() e.printStackTrace()
@ -495,6 +497,7 @@ class OsmandAidlHelper(private val app: Application) {
if (mIOsmAndAidlInterface != null) { if (mIOsmAndAidlInterface != null) {
try { try {
val layer = AMapLayer(id, name, zOrder, points) val layer = AMapLayer(id, name, zOrder, points)
layer.isImagePoints = true
return mIOsmAndAidlInterface!!.updateMapLayer(UpdateMapLayerParams(layer)) return mIOsmAndAidlInterface!!.updateMapLayer(UpdateMapLayerParams(layer))
} catch (e: RemoteException) { } catch (e: RemoteException) {
e.printStackTrace() e.printStackTrace()
@ -864,4 +867,15 @@ class OsmandAidlHelper(private val app: Application) {
} }
return false return false
} }
fun addOpenAppNavDrawerItem(itemName: String, appPackage: String, flags: Int): Boolean {
if (mIOsmAndAidlInterface != null) {
try {
return mIOsmAndAidlInterface!!.addOpenAppNavDrawerItem(AddOpenAppNavDrawerItemParams(itemName, appPackage, flags))
} catch (e: RemoteException) {
e.printStackTrace()
}
}
return false
}
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -2897,4 +2897,5 @@
<string name="download_all">تنزيل الكل</string> <string name="download_all">تنزيل الكل</string>
<string name="shared_string_restart">إعادة تشغيل التطبيق</string> <string name="shared_string_restart">إعادة تشغيل التطبيق</string>
<string name="shared_string_bookmark">إشارة مرجعية</string> <string name="shared_string_bookmark">إشارة مرجعية</string>
<string name="waypoints_removed_from_map_markers">نقاط بالطريق تم إزالتها من علامات الخريطة</string>
</resources> </resources>

View file

@ -3103,4 +3103,5 @@ Praparcyjnaj pamiacі %4$s MB (Abmiežavańnie Android %5$s MB, Dalvik %6$s MB).
<string name="search_no_results_description">Niama vynikaŭ? <string name="search_no_results_description">Niama vynikaŭ?
\nRaspaviadzicie nam ab hetym.</string> \nRaspaviadzicie nam ab hetym.</string>
<string name="send_search_query">Adpravić pašukovy zapyt?</string> <string name="send_search_query">Adpravić pašukovy zapyt?</string>
<string name="increase_search_radius_to">Pavialičyć radyus pošuku da %1$s</string>
</resources> </resources>

View file

@ -3154,4 +3154,5 @@
<string name="search_no_results_description">Няма вынікаў? <string name="search_no_results_description">Няма вынікаў?
\nРаспавядзіце нам аб гэтым.</string> \nРаспавядзіце нам аб гэтым.</string>
<string name="send_search_query">Адправіць пашуковы запыт?</string> <string name="send_search_query">Адправіць пашуковы запыт?</string>
<string name="increase_search_radius_to">Павялічыць радыус пошуку да %1$s</string>
</resources> </resources>

View file

@ -3741,4 +3741,10 @@
<string name="poi_hazard_minefield">Minové pole</string> <string name="poi_hazard_minefield">Minové pole</string>
<string name="poi_socket_type3">Počet konektorů typu 3</string>
<string name="poi_socket_type3_current">Maximální proud konektoru typ 3 [A]</string>
<string name="poi_socket_type3_output">Maximální výkon konektoru typ 3 [kW]</string>
<string name="poi_socket_tesla_standard">Počet stanic Tesla Destination Charger</string>
<string name="poi_socket_tesla_standard_current">Maximální proud stanice Tesla Destination Charger [A]</string>
<string name="poi_socket_tesla_standard_output">Maximální výkon stanice Tesla Destination Charger [kW]</string>
</resources> </resources>

View file

@ -3942,9 +3942,9 @@
<string name="poi_end_date">Slutdato</string> <string name="poi_end_date">Slutdato</string>
<string name="poi_appliance">Elektronik butik</string> <string name="poi_appliance">Butik for hårde hvidevarer</string>
<string name="poi_outcrop">Klippefremspring</string> <string name="poi_outcrop">Blotlagt klippe</string>
<string name="poi_payment_contactless_yes">Kontaktløs</string> <string name="poi_payment_contactless_yes">Kontaktløs</string>
<string name="poi_payment_contactless_no">Kontaktløs ikke accepteret</string> <string name="poi_payment_contactless_no">Kontaktløs ikke accepteret</string>
@ -3953,7 +3953,7 @@
<string name="poi_hazard_erosion">Erosionsfare</string> <string name="poi_hazard_erosion">Erosionsfare</string>
<string name="poi_hazard_avalanche">Lavinefare</string> <string name="poi_hazard_avalanche">Lavinefare</string>
<string name="poi_hazard_slippery_road">Glat vejbane</string> <string name="poi_hazard_slippery_road">Glat vejbane</string>
<string name="poi_hazard_flood">Oversvømmelse fare</string> <string name="poi_hazard_flood">Oversvømmelsesfare</string>
<string name="poi_hazard_minefield">Minefelt</string> <string name="poi_hazard_minefield">Minefelt</string>

View file

@ -3174,4 +3174,18 @@ Repræsenterer område: %1$s x %2$s</string>
<string name="search_no_results_description">Ingen resultater? <string name="search_no_results_description">Ingen resultater?
\nRapporter det.</string> \nRapporter det.</string>
<string name="send_search_query">Send søgeforespørgsel?</string> <string name="send_search_query">Send søgeforespørgsel?</string>
<string name="release_3_1">• Navigation: Fix statuslinjen, hurtigt ombytning af start-og slutpunkt på ruten
\n
\n• Kort markører: fastgør tænd/sluk-grupper, evne til at skjule markører på kortet
\n
\n• OSM redigering: mulighed for at redigere tags for ikke-punkt objekter, løs manglende kommentarer til noter, backup af redigeringer
\n
\n• Forbedre Wikipedia og Wikivoyage parsing, opdaterede filer findes allerede
\n
\n• Context menu: fix transport shields farve i nat-tilstand, fastsætte yderligere menu størrelser
\n
\n• Andre fejlrettelser
\n
\n</string>
<string name="increase_search_radius_to">Forøg søgeradius til %1$s</string>
</resources> </resources>

View file

@ -2955,7 +2955,7 @@ Abgedeckte Fläche: %1$s x %2$s</string>
<string name="north_abbreviation">N</string> <string name="north_abbreviation">N</string>
<string name="optional_point_name">Optionaler Punktname</string> <string name="optional_point_name">Optionaler Punktname</string>
<string name="transport_nearby_routes_within">Nahegelegene Routen innerhalb von</string> <string name="transport_nearby_routes_within">Nahegelegene Routen innerhalb von</string>
<string name="transport_nearby_routes">Innerhalb von</string> <string name="transport_nearby_routes">Innerhalb</string>
<string name="group_deleted">Gruppe gelöscht</string> <string name="group_deleted">Gruppe gelöscht</string>
<string name="rendering_attr_whiteWaterSports_name">Wildwasser-Sportarten</string> <string name="rendering_attr_whiteWaterSports_name">Wildwasser-Sportarten</string>
<string name="clear_all_intermediates">Alle Zwischenpunkte löschen</string> <string name="clear_all_intermediates">Alle Zwischenpunkte löschen</string>
@ -3072,4 +3072,17 @@ Abgedeckte Fläche: %1$s x %2$s</string>
\nNehmen Sie Kontakt mit uns auf.</string> \nNehmen Sie Kontakt mit uns auf.</string>
<string name="send_search_query">Suchanfrage senden?</string> <string name="send_search_query">Suchanfrage senden?</string>
<string name="shared_string_world">Welt</string> <string name="shared_string_world">Welt</string>
<string name="increase_search_radius_to">Vergrößerung des Suchradius auf %1$s</string>
<string name="release_3_1">• Navigation Fix: Fortschrittsbalken, schneller Wechsel des Start- und Endpunkts der Route
\n
\n• Map-Marker Fix: Gruppen An-/Ausschalten, Möglichkeit Marker auf der Karte zu verstecken
\n
\n• OSM-Bearbeitung: Bearbeitung für Nicht-Punkt-Objekte, Behebung fehlender Kommentare zu Notizen, Sicherung von Änderungen
\n
\n• Verbessere Wikipedia und Wikivoyage Parsing, aktualisierte Dateien sind bereits verfügbar
\n
\n• Kontextmenü: fixieren Sie die Transportschilderfarbe im Nachtmodus, fixieren Sie zusätzliche Menügrößen
\n
\n• Andere Fehlerbehebungen
\n</string>
</resources> </resources>

View file

@ -1463,7 +1463,7 @@
<string name="map_widget_left">Panel izquierdo</string> <string name="map_widget_left">Panel izquierdo</string>
<string name="shared_string_show">Mostrar</string> <string name="shared_string_show">Mostrar</string>
<string name="configure_map">Configurar mapa</string> <string name="configure_map">Configurar mapa</string>
<string name="search_radius_proximity">En un radio de</string> <string name="search_radius_proximity">A menos de</string>
<string name="rendering_category_routes">Rutas</string> <string name="rendering_category_routes">Rutas</string>
<string name="impassable_road">Evitar caminos…</string> <string name="impassable_road">Evitar caminos…</string>
<string name="rendering_attr_tramTrainRoutes_name">Rutas de tranvía y tren</string> <string name="rendering_attr_tramTrainRoutes_name">Rutas de tranvía y tren</string>

View file

@ -3118,4 +3118,9 @@ Area honi dagokio: %1$s x %2$s</string>
<string name="coord_input_save_as_track_descr">%1$s puntu gehitu dituzu. Idatzi fitxategi-izena eta sakatu \"Gorde\".</string> <string name="coord_input_save_as_track_descr">%1$s puntu gehitu dituzu. Idatzi fitxategi-izena eta sakatu \"Gorde\".</string>
<string name="point_deleted">%1$s puntua ezabatuta</string> <string name="point_deleted">%1$s puntua ezabatuta</string>
<string name="shared_string_world">Mundua</string> <string name="shared_string_world">Mundua</string>
<string name="increase_search_radius_to">Handitu bilaketa-erradioa %1$s-ra</string>
<string name="send_search_query_description">Zure bilaketa <b>\"%1$s\"</b> eta kokapena bidaliko dugu. <br/><br/>Ez dugu informazio pertsonala bilduko, bilaketa datuak algoritmoa hobetzeko biltzen ditugu.<br/></string>
<string name="search_no_results_description">Emaitzarik ez?
\nEman iezaguzu horren berri.</string>
<string name="send_search_query">Bilaketa-kontsulta bidali?</string>
</resources> </resources>

View file

@ -705,7 +705,7 @@
<string name="poi_pump">پنجرگیری دوچرخه</string> <string name="poi_pump">پنجرگیری دوچرخه</string>
<string name="poi_observatory_designation">رصدخانه</string> <string name="poi_observatory_designation">رصدخانه</string>
<string name="poi_pharmacy_dispensing">داروخانه</string> <string name="poi_pharmacy_dispensing">داروخانه</string>
<string name="poi_star_rating">ستاره دار</string> <string name="poi_star_rating">رتبه‌بندی ستاره‌ای</string>
<string name="poi_clock_option">تنظیمات ساعت</string> <string name="poi_clock_option">تنظیمات ساعت</string>
<string name="poi_scout_camp">کمپ گردشگری</string> <string name="poi_scout_camp">کمپ گردشگری</string>
<string name="poi_backcountry">پشت صحنه</string> <string name="poi_backcountry">پشت صحنه</string>
@ -1016,4 +1016,6 @@
<string name="poi_emergency_infrastructure">زیرساخت فوریتی</string> <string name="poi_emergency_infrastructure">زیرساخت فوریتی</string>
<string name="poi_enforcement_toll">اعمال قانون: عوارضی</string> <string name="poi_enforcement_toll">اعمال قانون: عوارضی</string>
<string name="poi_start_date">تاریخ شروع</string>
<string name="poi_stars_2">۲ (استاندارد)</string>
</resources> </resources>

View file

@ -3170,4 +3170,5 @@
<string name="search_no_results_description">چیزی پیدا نشد؟ <string name="search_no_results_description">چیزی پیدا نشد؟
\nدر این باره با ما صحبت کنید.</string> \nدر این باره با ما صحبت کنید.</string>
<string name="send_search_query">عبارت جست‌وجویتان ارسال شود؟</string> <string name="send_search_query">عبارت جست‌وجویتان ارسال شود؟</string>
<string name="increase_search_radius_to">افزایش شعاع جست‌وجو به %1$s</string>
</resources> </resources>

View file

@ -3153,19 +3153,18 @@ représentant la zone : %1$s x %2$s</string>
<string name="search_no_results_description">Aucun résultat ? <string name="search_no_results_description">Aucun résultat ?
\nSignalez-le nous.</string> \nSignalez-le nous.</string>
<string name="send_search_query">Envoyez votre recherche ?</string> <string name="send_search_query">Envoyez votre recherche ?</string>
<string name="release_3_1">• Navigation : correction de la barre de progression, inversion facile entre le point de départ et le point d\'arrivée <string name="release_3_1">• Navigation : correction de la barre de progression, permutation facile entre le point de départ et le point d\'arrivée
\n \n
\n• Marque : correction pour l\'activation / désactivation des groupes, possibilité de masquer les marques sur la carte \n• Marque : correction pour l\'activation / désactivation des groupes, possibilité de masquer les marques sur la carte
\n \n
\n• Modifications OSM : possibilité de modifier les objets autres que les points, correction de la perte des commentaires et des notes, copie de sauvegarde des modifications \n• Modifications OSM : possibilité de modifier les objets autres que les points, correction de la perte des commentaires et des notes, copie de sauvegarde des modifications
\n \n
\n • Amélioration de Wikipedia et Wikivoyage, les fichiers mis à jour sont déjà disponibles \n• Amélioration de Wikipedia et Wikivoyage, les fichiers à jour sont déjà disponibles
\n \n
\n • Menu contextuel : correction de la taille des menus, correction en mode nuit \n• Menu contextuel : correction de la taille des menus, correction des couleurs en mode nuit
\n \n
\n• Autres corrections \n• Autres corrections
\n \n
\n
\n</string> \n</string>
<string name="increase_search_radius_to">Augmenter le rayon de recherche à %1$s</string> <string name="increase_search_radius_to">Augmenter le rayon de recherche à %1$s</string>
</resources> </resources>

View file

@ -3066,4 +3066,5 @@
<string name="search_no_results_description">אין תוצאות? <string name="search_no_results_description">אין תוצאות?
\nנשמח לקבל דיווח על כך.</string> \nנשמח לקבל דיווח על כך.</string>
<string name="send_search_query">לשלוח את שאילתת החיפוש?</string> <string name="send_search_query">לשלוח את שאילתת החיפוש?</string>
<string name="increase_search_radius_to">הגדלת רדיוס החיפוש ל־%1$s</string>
</resources> </resources>

View file

@ -1326,4 +1326,9 @@
<string name="poi_aeroway_fuel">Flybrenselstasjon</string> <string name="poi_aeroway_fuel">Flybrenselstasjon</string>
<string name="poi_waterway_fuel">Båtbensinstasjon</string> <string name="poi_waterway_fuel">Båtbensinstasjon</string>
<string name="poi_helipad">Helikopterlandingsplass</string> <string name="poi_helipad">Helikopterlandingsplass</string>
<string name="poi_fire_water_pond">Branndam</string>
<string name="poi_fuel_octane_80">80-oktan</string>
<string name="poi_communication_tower">Kommunikasjonstårn</string>
<string name="poi_observation_tower">Utkikkstårn</string>
<string name="poi_lighting_tower">Lysmast</string>
</resources> </resources>

View file

@ -3082,4 +3082,23 @@ Reprezentuje obszar: %1$s x %2$s</string>
<string name="coord_input_add_point">Dodaj punkt</string> <string name="coord_input_add_point">Dodaj punkt</string>
<string name="coord_input_save_as_track_descr">Dodano %1$s punktów. Proszę wprowadzić nazwę pliku i nacisnąć „Zapisz”.</string> <string name="coord_input_save_as_track_descr">Dodano %1$s punktów. Proszę wprowadzić nazwę pliku i nacisnąć „Zapisz”.</string>
<string name="coord_input_save_as_track">Zapisz jako ślad</string> <string name="coord_input_save_as_track">Zapisz jako ślad</string>
<string name="release_3_1">• Nawigacja: naprawiono pasek postępu, szybka zamiana punktu początkowego i końcowego trasy
\n
\n• Znaczniki mapy: naprawiono włączanie/wyłączanie grup, możliwość ukrycia znaczników na mapie
\n
\n• Edytowanie OSM: możliwość edycji tagów dla niepunktowych obiektów, naprawiono brakujące komentarze do uwag, kopia zapasowa edycji
\n
\n• Ulepszono analizowanie Wikipedii i Wikipodróży, zaktualizowane pliki są już dostępne
\n
\n• Menu kontekstowe: poprawiono kolor tarcz transportowych w trybie nocnym, naprawiono dodatkowe rozmiary menu
\n
\n• Inne poprawki błędów
\n</string>
<string name="increase_search_radius_to">Zwiększ promień wyszukiwania do %1$s</string>
<string name="send_search_query_description">Wyślemy twoje zapytanie: <b>\"%1$s\"</b>, oraz twoje położenie.<br/><br/> Nie zbieramy informacji osobistych, potrzebujemy tylko danych wyszukiwania do poprawienia algorytmu wyszukiwania.<br/></string>
<string name="search_no_results_description">Brak wyników?
\nPowiedz nam o tym.</string>
<string name="send_search_query">Wysłać zapytanie?</string>
<string name="shared_string_world">Świat</string>
<string name="point_deleted">Usunięto punkt %1$s</string>
</resources> </resources>

View file

@ -3109,4 +3109,18 @@ Pro praghere iscrie su còdighe intreu</string>
<string name="search_no_results_description">Perunu risultadu? <string name="search_no_results_description">Perunu risultadu?
\nFaghide·nos·lu ischire.</string> \nFaghide·nos·lu ischire.</string>
<string name="send_search_query">Imbiare sos tèrmines de chirca?</string> <string name="send_search_query">Imbiare sos tèrmines de chirca?</string>
<string name="release_3_1">• Nàvigu: Barra de progressu acontzada, cuncàmbiu lestru intre sos puntos de incumintzu e de acabu de s\'àndala
\n
\n • Marcadores de sa mapa: acontzu de s\'allughidura/istudadura de sos grupos, possibilidade de istichire marcadores dae sa mapa
\n
\n • Modìficas OSM: Possibilidade de modificare sas etichetas pro sos ogetos chi non sunt puntos, acontzu de su problema de sos cummentos chi mancaiant in sas notas, còpia de seguresa de sas modìficas
\n
\n • Anàlisi de Wikipedia e de Wikivoyage megioradas, sos documentos agiornados sunt giai disponìbiles
\n
\n • Menù de cuntestu: colores de sos iscudos de trasportu in sa modalidade pro sa note acontzados, mannàrias pro sos menùs additzionales acontzadas
\n
\n • Àteros acontzos de errores
\n
\n</string>
<string name="increase_search_radius_to">Ismànnia su raju de chirca finas a %1$s</string>
</resources> </resources>

View file

@ -3531,4 +3531,19 @@
<string name="poi_cable_number">Počet lán</string> <string name="poi_cable_number">Počet lán</string>
<string name="poi_via_ferrata_scale">Náročnosť</string> <string name="poi_via_ferrata_scale">Náročnosť</string>
<string name="poi_checkpoint_type">Typ kontrolného stanovišťa</string>
<string name="poi_appliance">Obchod so spotrebičmi</string>
<string name="poi_payment_contactless_yes">Bezkontaktne</string>
<string name="poi_payment_contactless_no">Bezkontaktne nie je možné platiť</string>
<string name="poi_hazard_nuclear">Nebezpečenstvo rádioaktivity</string>
<string name="poi_hazard_erosion">Nebezpečenstvo erózie</string>
<string name="poi_hazard_avalanche">Nebezpečenstvo lavín</string>
<string name="poi_hazard_slippery_road">Klzká cesta</string>
<string name="poi_hazard_flood">Nebezpečenstvo záplav</string>
<string name="poi_hazard_minefield">Mínové pole</string>
</resources> </resources>

View file

@ -1422,7 +1422,7 @@ Proporčná pamäť %4$s MB (Limit Androidu %5$s MB, Dalvik %6$s MB).</string>
<string name="map_widget_right">Pravý panel</string> <string name="map_widget_right">Pravý panel</string>
<string name="map_widget_left">Ľavý panel</string> <string name="map_widget_left">Ľavý panel</string>
<string name="configure_map">Nastaviť mapu</string> <string name="configure_map">Nastaviť mapu</string>
<string name="search_radius_proximity">Vovnútri</string> <string name="search_radius_proximity">Do vzdialenosti</string>
<string name="rendering_category_routes">Trasy</string> <string name="rendering_category_routes">Trasy</string>
<string name="rendering_attr_trainLightrailRoutes_name">Vlakové linky</string> <string name="rendering_attr_trainLightrailRoutes_name">Vlakové linky</string>
<string name="rendering_attr_tramRoutes_name">Električkové linky</string> <string name="rendering_attr_tramRoutes_name">Električkové linky</string>
@ -2853,7 +2853,7 @@ Zodpovedá oblasti: %1$s x %2$s</string>
<string name="north_abbreviation">S</string> <string name="north_abbreviation">S</string>
<string name="optional_point_name">Voliteľný názov bodu</string> <string name="optional_point_name">Voliteľný názov bodu</string>
<string name="transport_nearby_routes_within">Blízke trasy do</string> <string name="transport_nearby_routes_within">Blízke trasy do</string>
<string name="transport_nearby_routes">Vovnútri</string> <string name="transport_nearby_routes">Do vzdialenosti</string>
<string name="rendering_attr_whiteWaterSports_name">Divoká voda</string> <string name="rendering_attr_whiteWaterSports_name">Divoká voda</string>
<string name="group_deleted">Skupina odstránená</string> <string name="group_deleted">Skupina odstránená</string>
<string name="waypoints_removed_from_map_markers">Body trasy odstránené z mapových značiek</string> <string name="waypoints_removed_from_map_markers">Body trasy odstránené z mapových značiek</string>
@ -2965,4 +2965,22 @@ Zodpovedá oblasti: %1$s x %2$s</string>
<string name="coord_input_save_as_track_descr">Pridali ste %1$s bodov. Zadajte názov súboru a stlačte \"Uložiť\".</string> <string name="coord_input_save_as_track_descr">Pridali ste %1$s bodov. Zadajte názov súboru a stlačte \"Uložiť\".</string>
<string name="point_deleted">Bod %1$s vymazaný</string> <string name="point_deleted">Bod %1$s vymazaný</string>
<string name="shared_string_world">Celý svet</string> <string name="shared_string_world">Celý svet</string>
<string name="release_3_1">• Navigácia: Opravený indikátor postupu, rýchle prepínanie začiatočného a koncového bodu trasy
\n
\n • Mapové značky: opravené zapínanie a vypínanie skupín, možnosť skryť značky z mapy
\n
\n • Úpravy OSM: Možnosť meniť značky nebodovách objektov, oprava chýbajúcich komentárov na poznámkach, záloha úprav
\n
\n • Vylepšené čítanie Wikipédie a Wikivoyage, aktualizované súbory sú už k dispozícii
\n
\n • Kontextové menu: opravené farby znakov ciest v nočnom režime, opravené doplnkové veľkosti menu
\n
\n • Opravy ďalších chýb
\n
\n</string>
<string name="increase_search_radius_to">Zväčšiť polomer hľadania na %1$s</string>
<string name="send_search_query_description">Odošleme váš vyhľadávaciu požiadavku: <b>\"%1$s\"</b>, ako aj vašu polohu.<br/><br/> Nezbierame osobné údaje, potrebujeme len údaje vyhľadávania na vylepšenie vyhľadávací algoritmus.<br/></string>
<string name="search_no_results_description">Žiadne výsledky?
\nPovedzte nám o tom.</string>
<string name="send_search_query">Odoslať vyhľadávaciu požiadavku?</string>
</resources> </resources>

View file

@ -2971,4 +2971,5 @@
<string name="search_no_results_description">Нема резултата? <string name="search_no_results_description">Нема резултата?
\nРеците нам о овоме.</string> \nРеците нам о овоме.</string>
<string name="send_search_query">Пошаљи упит претраге?</string> <string name="send_search_query">Пошаљи упит претраге?</string>
<string name="increase_search_radius_to">Повећај полупречник претраге на %1$s</string>
</resources> </resources>

View file

@ -183,7 +183,7 @@
<string name="poi_service_tyres">Шини</string> <string name="poi_service_tyres">Шини</string>
<string name="poi_vehicle_inspection">Огляд автомобіля</string> <string name="poi_vehicle_inspection">Огляд автомобіля</string>
<string name="poi_car_wash">Мийка автомобіля</string> <string name="poi_car_wash">Мийка автомобіля</string>
<string name="poi_fuel">АЗС</string> <string name="poi_fuel">АЗС;Автомобільна заправка;Автозаправка;Бензоколонка;Бензозаправка</string>
<string name="poi_fuel_diesel">Дизель</string> <string name="poi_fuel_diesel">Дизель</string>
<string name="poi_fuel_gtl_diesel">Високоякісний дизель</string> <string name="poi_fuel_gtl_diesel">Високоякісний дизель</string>
<string name="poi_fuel_hgv_diesel">TIR дизель</string> <string name="poi_fuel_hgv_diesel">TIR дизель</string>
@ -3825,4 +3825,41 @@
<string name="poi_aerialway_zip_line">Зіплайн</string> <string name="poi_aerialway_zip_line">Зіплайн</string>
<string name="poi_climbing_adventure">Пригоди з скелелазенням</string>
<string name="poi_via_ferrata">Віа феррата</string>
<string name="poi_glacier_type_icecap">Льодовиковий покрив</string>
<string name="poi_glacier_type_icefield">Льодовикове поле</string>
<string name="poi_glacier_type_plateau">Плато</string>
<string name="poi_glacier_type_valley">Долинний льодовик</string>
<string name="poi_glacier_type_outlet">Відтік</string>
<string name="poi_glacier_type_tidewater">Стічна вода</string>
<string name="poi_glacier_type_icefall">Льодоспад</string>
<string name="poi_glacier_type_rock">Скала</string>
<string name="poi_glacier_type_shelf">Шельфовий</string>
<string name="poi_glacier_type_remnant">Залишок</string>
<string name="poi_glacier_type_ice_tongue">Льодовий язик</string>
<string name="poi_glacier_ele_top">Найвища точка</string>
<string name="poi_glacier_ele_bottom">Найнижча точка</string>
<string name="poi_glacier_slope">Середній схил</string>
<string name="poi_checkpoint_hiking">Пішохідний контрольний пункт</string>
<string name="poi_checkpoint_type_stamp">Пункт штампування</string>
<string name="poi_checkpoint_type_needler">Голкова машина</string>
<string name="poi_checkpoint_type_quize">Вікторина</string>
<string name="poi_rock">Скеля</string>
<string name="poi_appliance">Магазин побутової техніки</string>
<string name="poi_outcrop">Оголення порід</string>
<string name="poi_hazard_nuclear">Радіаційна небезпека</string>
<string name="poi_hazard_erosion">Ерозійна небезпека</string>
<string name="poi_hazard_avalanche">Небезпека лавини</string>
<string name="poi_hazard_slippery_road">Слизька дорога</string>
<string name="poi_hazard_flood">Небезпека затоплення</string>
<string name="poi_hazard_minefield">Мінне поле</string>
</resources> </resources>

View file

@ -653,7 +653,7 @@
<string name="loading_streets">Завантажуються вулиці…</string> <string name="loading_streets">Завантажуються вулиці…</string>
<string name="loading_cities">Завантажуються міста…</string> <string name="loading_cities">Завантажуються міста…</string>
<string name="poi">POI</string> <string name="poi">Корисне місце</string>
<string name="error_occurred_saving_gpx">Помилка збереження шляху в GPX файл</string> <string name="error_occurred_saving_gpx">Помилка збереження шляху в GPX файл</string>
<string name="error_calculating_route">Помилка розрахунку маршруту</string> <string name="error_calculating_route">Помилка розрахунку маршруту</string>
<string name="error_calculating_route_occured">Помилка прокладання маршруту</string> <string name="error_calculating_route_occured">Помилка прокладання маршруту</string>
@ -1010,8 +1010,8 @@
<string name="intermediate_point">Проміжний пункт %1$s</string> <string name="intermediate_point">Проміжний пункт %1$s</string>
<string name="context_menu_item_last_intermediate_point">Додати як останню проміжну точку</string> <string name="context_menu_item_last_intermediate_point">Додати як останню проміжну точку</string>
<string name="context_menu_item_first_intermediate_point">Додати як першу проміжну точку</string> <string name="context_menu_item_first_intermediate_point">Додати як першу проміжну точку</string>
<string name="add_as_last_destination_point">Додати як останню проміжну точку</string> <string name="add_as_last_destination_point">Додати як останній проміжний пункт призначення</string>
<string name="add_as_first_destination_point">Додати як першу проміжну точку</string> <string name="add_as_first_destination_point">Додати як перший проміжний пункт призначення</string>
<string name="replace_destination_point">Замінити пункт призначення</string> <string name="replace_destination_point">Замінити пункт призначення</string>
<string name="new_destination_point_dialog">Ви вже встановили пункт призначення:</string> <string name="new_destination_point_dialog">Ви вже встановили пункт призначення:</string>
<string name="shared_string_target_points">Точки призначення</string> <string name="shared_string_target_points">Точки призначення</string>
@ -1180,7 +1180,7 @@
<string name="cancel_route">Відхилити маршрут</string> <string name="cancel_route">Відхилити маршрут</string>
<string name="search_street_in_neighborhood_cities">Шукати в навколишніх містах</string> <string name="search_street_in_neighborhood_cities">Шукати в навколишніх містах</string>
<string name="intermediate_items_sort_return">Проміжні точки впорядковано оптимальним чином від поточної до кінцевої.</string> <string name="intermediate_items_sort_return">Проміжні точки впорядковано оптимальним чином від поточної до кінцевої.</string>
<string name="intermediate_items_sort_by_distance">Впорядкувати за відстанню</string> <string name="intermediate_items_sort_by_distance">Впорядкувати від дверей до дверей</string>
<string name="local_osm_changes_backup_successful">Файл змін OSM успішно створений в %1$s</string> <string name="local_osm_changes_backup_successful">Файл змін OSM успішно створений в %1$s</string>
<string name="osmand_distance_planning_plugin_name">Інструмент підрахунку відстані і планування</string> <string name="osmand_distance_planning_plugin_name">Інструмент підрахунку відстані і планування</string>
<string name="please_select_address">Виберіть місто або вулицю</string> <string name="please_select_address">Виберіть місто або вулицю</string>
@ -1508,7 +1508,7 @@
<string name="calculate_osmand_route_without_internet">Розрахувати ділянку маршруту OsmAnd без Інтернету</string> <string name="calculate_osmand_route_without_internet">Розрахувати ділянку маршруту OsmAnd без Інтернету</string>
<string name="gpx_option_calculate_first_last_segment">Обчислити маршрут OsmAnd для першого та останнього сегментів маршруту</string> <string name="gpx_option_calculate_first_last_segment">Обчислити маршрут OsmAnd для першого та останнього сегментів маршруту</string>
<string name="use_displayed_track_for_navigation">Чи Ви хочете використовувати відображення треку для навігації?</string> <string name="use_displayed_track_for_navigation">Чи Ви хочете використовувати відображення треку для навігації?</string>
<string name="keep_and_add_destination_point">Додати як наступний пункт призначення</string> <string name="keep_and_add_destination_point">Додати наступним пунктом призначення</string>
<string name="select_gpx">Виберіть GPX…</string> <string name="select_gpx">Виберіть GPX…</string>
<string name="route_descr_select_destination">Виберіть пункт призначення</string> <string name="route_descr_select_destination">Виберіть пункт призначення</string>
<string name="shared_string_select_on_map">Виберіть на мапі</string> <string name="shared_string_select_on_map">Виберіть на мапі</string>
@ -2169,7 +2169,7 @@
<string name="add_time_span">Додати часовий проміжок</string> <string name="add_time_span">Додати часовий проміжок</string>
<string name="road_blocked">Дорога заблокована</string> <string name="road_blocked">Дорога заблокована</string>
<string name="shared_string_select">Вибрати</string> <string name="shared_string_select">Вибрати</string>
<string name="switch_start_finish">Поміняти місцями точки призначення та початку</string> <string name="switch_start_finish">Поміняти місцями пункт відправлення і пункт призначення</string>
<string name="rendering_attr_hideIcons_name">Значки POI</string> <string name="rendering_attr_hideIcons_name">Значки POI</string>
<string name="item_removed">Елемент видалено</string> <string name="item_removed">Елемент видалено</string>
<string name="n_items_removed">Елементи видалено</string> <string name="n_items_removed">Елементи видалено</string>
@ -3040,7 +3040,7 @@
<string name="map_import_error">Помилка імпорту мапи</string> <string name="map_import_error">Помилка імпорту мапи</string>
<string name="map_imported_successfully">Мапа успішна імпортована</string> <string name="map_imported_successfully">Мапа успішна імпортована</string>
<string name="make_as_start_point">Зробити початковою точкою</string> <string name="make_as_start_point">Зробити пунктом відправлення</string>
<string name="shared_string_current">Поточний</string> <string name="shared_string_current">Поточний</string>
<string name="last_intermediate_dest_description">Додає останню зупинку на маршруті</string> <string name="last_intermediate_dest_description">Додає останню зупинку на маршруті</string>
<string name="first_intermediate_dest_description">Додає першу зупинку на маршруті</string> <string name="first_intermediate_dest_description">Додає першу зупинку на маршруті</string>
@ -3104,4 +3104,34 @@
<string name="shared_string_restart">Перезапуск</string> <string name="shared_string_restart">Перезапуск</string>
<string name="show_images">Показати зображення</string> <string name="show_images">Показати зображення</string>
<string name="off_road_render_descr">"Підходить для використання під час їзди по бездоріжжю. Підходить для використання з зеленими супутниковими зображеннями в якості підкладки карти. Ключові особливості: зменшена товщина основних доріг, збільшена товщина доріжок, стежок, велосипедних та інших маршрутів. Засноване на стилі „Topo“."</string> <string name="off_road_render_descr">"Підходить для використання під час їзди по бездоріжжю. Підходить для використання з зеленими супутниковими зображеннями в якості підкладки карти. Ключові особливості: зменшена товщина основних доріг, збільшена товщина доріжок, стежок, велосипедних та інших маршрутів. Засноване на стилі „Topo“."</string>
<string name="light_rs_render_descr">Простий і контрастний стиль для автомобільної навігації. Комфортний для очей в нічному режимі. Ключові особливості: контурні лінії, контрастні помаранчеві дороги, менше відволікаючих другорядних об\'єктів на мапі.</string>
<string name="topo_render_descr">Контрастний стиль, призначений в основному для піших прогулянок, походів і велосипедних прогулянок на природі. Хороша читабельність при складному зовнішньому освітленні. Ключові особливості: контрастні дороги і природні об\'єкти, різні типи маршрутів, контурні лінії з розширеними настройками, більш детальна інформація при відповідних рівнях масштабування, ніж в стилі за замовчуванням. Опція „Якість дорожнього покриття“ дозволяє розрізняти дороги з різною якістю поверхні. Немає нічного режиму.</string>
<string name="mapnik_render_descr">Старий стиль відображення за умовчанням „Mapnik“. Ключові особливості: кольору схожі на стиль „Mapnik“.</string>
<string name="touring_view_render_descr">Високо деталізований стиль для туристичних цілей. Включає усі параметри конфігурації стилю за умованням, крім того: відображає якомога більше деталей, зокрема, усі дороги, стежки та інші способи переміщення. Чітка візуальна відмінність між усіма типами доріг, ремінісценція багатьох туристичних атласів. Висококонтрастна колірна схема для вуличного використання, денний і нічний режим.</string>
<string name="default_render_descr">Стиль загального призначення. Спрощений рендеринг в густонаселених містах. Ключові особливості: контурні лінії, маршрути, якість поверхні, обмеження доступу, дорожні щити, візуалізація маршрутів за шкалою SAC, характеристики спортивних сплавів.</string>
<string name="open_wikipedia_link_online">Відкрити посилання Вікіпедії в онлайні</string>
<string name="open_wikipedia_link_online_description">Посилання буде відкрите в веб-браузері.</string>
<string name="read_wikipedia_offline_description">Отримайте підписку на OsmAnd Live, щоб читати статті у Вікіпедії та вікімандри в автономному режимі.</string>
<string name="read_wikipedia_offline">Читати Вікіпедію в автономному режимі</string>
<string name="purchase_cancelled_dialog_title">Ви скасували підписку OsmAnd Live</string>
<string name="purchase_cancelled_dialog_descr">Відновіть підписку, щоб продовжити використовувати усі функції:</string>
<string name="maps_you_need_descr">На основі збережених Вами статей ми рекомендуємо Вам звантажити наступні мапи:</string>
<string name="maps_you_need">Потрібні Вам мапи</string>
<string name="osmand_team">Команда OsmAnd</string>
<string name="popular_destinations">Популярні напрямки</string>
<string name="paid_app">Платний додаток</string>
<string name="travel_card_update_descr">Доступні нові дані ВікіМандри, оновіть їх та насолоджуйтеся.</string>
<string name="travel_card_download_descr">Завантажте путівники ВікіМандри, щоб переглянути статті про місця в усьому світі без підключення до Інтернету.</string>
<string name="update_is_available">Оновлення доступне</string>
<string name="download_file">Звантажити файл</string>
<string name="start_editing_card_image_text">Вільний всесвітній путівник, який може редагувати кожен.</string>
<string name="welcome_to_open_beta_description">Туристичні путівники в даний час засновані на Вікімандрах. Перевірте усі функції безкоштовно під час відкритого бета-тестування. Потім путівники будуть доступні передплатникам OsmAnd Unlimited і власником OsmAnd+.</string>
<string name="start_editing_card_description">Вам можна і слід редагувати будь-яку статтю на Вікімандрах. Діліться знаннями, досвідом, талантом і вашої увагою</string>
<string name="start_editing">Розпочати редагування</string>
<string name="get_unlimited_access">Отримати необмежений доступ</string>
<string name="welcome_to_open_beta">Ласкаво просимо на відкрите бета-тестування</string>
<string name="wikivoyage_travel_guide">Туристичний путівник</string>
<string name="wikivoyage_travel_guide_descr">Переглядайте путівники Вікімандів про найцікавіші місця на планеті всередині OsmAnd без підключення до інтернету.</string>
<string name="clear_all_intermediates">Очистити усі проміжні точки</string>
</resources> </resources>

View file

@ -2715,4 +2715,7 @@
<string name="download_wikipedia_label">下载维基百科数据</string> <string name="download_wikipedia_label">下载维基百科数据</string>
<string name="open_in_browser_wiki">在线打开文章</string> <string name="open_in_browser_wiki">在线打开文章</string>
<string name="wiki_article_not_found">文章未找到</string> <string name="wiki_article_not_found">文章未找到</string>
<string name="increase_search_radius_to">增大搜索半径至 %1$s</string>
<string name="send_search_query_description">我们将会发送您的搜索请求:<b>\"%1$s\"</b>,以及您的位置。<br/><br/>我们不会搜集您的个人信息,我们只需要搜索数据以改进搜索算法。<br/></string>
<string name="send_search_query">发送搜索请求?</string>
</resources> </resources>

View file

@ -3127,4 +3127,17 @@
<string name="search_no_results_description">沒有結果? <string name="search_no_results_description">沒有結果?
\n告訴我們這件事。</string> \n告訴我們這件事。</string>
<string name="send_search_query">送出搜尋查詢?</string> <string name="send_search_query">送出搜尋查詢?</string>
<string name="release_3_1">• 導航:修復進度列,快速交換路線的起點和終點
\n
\n • 地圖標記:修復開/關群組,從地圖中隱藏標記的功能
\n
\n • OSM 編輯:能夠編輯非點物件標記,修復評論上遺漏的註解、編輯備份
\n
\n • 改善 Wikipedia 和維基導遊分析,更新檔案已經能用
\n
\n • 內容選單:在夜間模式下修復交通保護顏色,修復附加選單大小
\n
\n • 其他錯誤修復
\n</string>
<string name="increase_search_radius_to">將搜尋半徑增加到 %1$s</string>
</resources> </resources>

View file

@ -53,6 +53,8 @@ import net.osmand.aidl.gpx.RemoveGpxParams;
import net.osmand.aidl.maplayer.point.ShowMapPointParams; import net.osmand.aidl.maplayer.point.ShowMapPointParams;
import net.osmand.aidl.navdrawer.AddOpenAppNavDrawerItemParams;
// NOTE: Add new methods at the end of file!!! // NOTE: Add new methods at the end of file!!!
interface IOsmAndAidlInterface { interface IOsmAndAidlInterface {
@ -105,4 +107,6 @@ interface IOsmAndAidlInterface {
boolean removeGpx(in RemoveGpxParams params); boolean removeGpx(in RemoveGpxParams params);
boolean showMapPoint(in ShowMapPointParams params); boolean showMapPoint(in ShowMapPointParams params);
boolean addOpenAppNavDrawerItem(in AddOpenAppNavDrawerItemParams params);
} }

View file

@ -1,5 +1,6 @@
package net.osmand.aidl; package net.osmand.aidl;
import android.app.Activity;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
@ -12,6 +13,7 @@ import android.os.ParcelFileDescriptor;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.ArrayAdapter;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
@ -28,6 +30,8 @@ import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.plus.ApplicationMode; import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.FavouritesDbHelper; import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.GPXDatabase.GpxDataItem; import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities;
@ -38,6 +42,7 @@ import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarker; import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.TargetPointsHelper; import net.osmand.plus.TargetPointsHelper;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin; import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
@ -826,6 +831,7 @@ public class OsmandAidlApi {
for (AMapPoint point : layer.getPoints()) { for (AMapPoint point : layer.getPoints()) {
existingLayer.putPoint(point); existingLayer.putPoint(point);
} }
existingLayer.copyZoomBounds(layer);
refreshMap(); refreshMap();
return true; return true;
} else { } else {
@ -1185,4 +1191,41 @@ public class OsmandAidlApi {
app.sendBroadcast(intent); app.sendBroadcast(intent);
return true; return true;
} }
boolean addOpenAppNavDrawerItem(String itemName, String appPackage, int flags) {
if (!TextUtils.isEmpty(itemName) && !TextUtils.isEmpty(appPackage)) {
OsmandSettings settings = app.getSettings();
settings.API_NAV_DRAWER_ITEM_NAME.set(itemName);
settings.API_NAV_DRAWER_ITEM_APP_PACKAGE.set(appPackage);
settings.API_NAV_DRAWER_ITEM_FLAGS.set(flags);
return true;
}
return false;
}
public void registerNavDrawerItem(final Activity activity, ContextMenuAdapter adapter) {
final OsmandSettings settings = app.getSettings();
final String itemName = settings.API_NAV_DRAWER_ITEM_NAME.get();
final String appPackage = settings.API_NAV_DRAWER_ITEM_APP_PACKAGE.get();
if (!TextUtils.isEmpty(itemName) && !TextUtils.isEmpty(appPackage)) {
final Intent intent = activity.getPackageManager().getLaunchIntentForPackage(appPackage);
if (intent != null) {
int flags = settings.API_NAV_DRAWER_ITEM_FLAGS.get();
if (flags != -1) {
intent.addFlags(flags);
}
adapter.addItem(new ContextMenuItem.ItemBuilder()
.setTitle(itemName)
.setListener(new ContextMenuAdapter.ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int position, boolean isChecked, int[] viewCoordinates) {
activity.startActivity(intent);
return true;
}
})
.createItem());
}
}
}
} }

View file

@ -34,6 +34,7 @@ import net.osmand.aidl.mapmarker.UpdateMapMarkerParams;
import net.osmand.aidl.mapwidget.AddMapWidgetParams; import net.osmand.aidl.mapwidget.AddMapWidgetParams;
import net.osmand.aidl.mapwidget.RemoveMapWidgetParams; import net.osmand.aidl.mapwidget.RemoveMapWidgetParams;
import net.osmand.aidl.mapwidget.UpdateMapWidgetParams; import net.osmand.aidl.mapwidget.UpdateMapWidgetParams;
import net.osmand.aidl.navdrawer.AddOpenAppNavDrawerItemParams;
import net.osmand.aidl.navigation.NavigateGpxParams; import net.osmand.aidl.navigation.NavigateGpxParams;
import net.osmand.aidl.navigation.NavigateParams; import net.osmand.aidl.navigation.NavigateParams;
import net.osmand.aidl.note.StartAudioRecordingParams; import net.osmand.aidl.note.StartAudioRecordingParams;
@ -457,5 +458,15 @@ public class OsmandAidlService extends Service {
return false; return false;
} }
} }
@Override
public boolean addOpenAppNavDrawerItem(AddOpenAppNavDrawerItemParams params) throws RemoteException {
try {
return params != null && getApi("addOpenAppNavDrawerItem").addOpenAppNavDrawerItem(params.getItemName(), params.getAppPackage(), params.getFlags());
} catch (Exception e) {
handleException(e);
return false;
}
}
}; };
} }

View file

@ -16,6 +16,14 @@ public class AMapLayer implements Parcelable {
private float zOrder = 5.5f; private float zOrder = 5.5f;
private Map<String, AMapPoint> points = new ConcurrentHashMap<>(); private Map<String, AMapPoint> points = new ConcurrentHashMap<>();
private boolean imagePoints = false;
private int circlePointMinZoom = 0;
private int circlePointMaxZoom = 6;
private int smallPointMinZoom = 7;
private int smallPointMaxZoom = 13;
private int bigPointMinZoom = 14;
private int bigPointMaxZoom = 22;
public AMapLayer(String id, String name, float zOrder, List<AMapPoint> pointList) { public AMapLayer(String id, String name, float zOrder, List<AMapPoint> pointList) {
this.id = id; this.id = id;
this.name = name; this.name = name;
@ -74,11 +82,74 @@ public class AMapLayer implements Parcelable {
points.remove(pointId); points.remove(pointId);
} }
public boolean isImagePoints() {
return imagePoints;
}
public void setImagePoints(boolean imagePoints) {
this.imagePoints = imagePoints;
}
public void copyZoomBounds(AMapLayer layer) {
circlePointMinZoom = layer.circlePointMinZoom;
circlePointMaxZoom = layer.circlePointMaxZoom;
smallPointMinZoom = layer.smallPointMinZoom;
smallPointMaxZoom = layer.smallPointMaxZoom;
bigPointMinZoom = layer.bigPointMinZoom;
bigPointMaxZoom = layer.bigPointMaxZoom;
}
public void setCirclePointZoomBounds(int min, int max) {
circlePointMinZoom = min;
circlePointMaxZoom = max;
}
public void setSmallPointZoomBounds(int min, int max) {
smallPointMinZoom = min;
smallPointMaxZoom = max;
}
public void setBigPointZoomBounds(int min, int max) {
bigPointMinZoom = min;
bigPointMaxZoom = max;
}
public int getCirclePointMinZoom() {
return circlePointMinZoom;
}
public int getCirclePointMaxZoom() {
return circlePointMaxZoom;
}
public int getSmallPointMinZoom() {
return smallPointMinZoom;
}
public int getSmallPointMaxZoom() {
return smallPointMaxZoom;
}
public int getBigPointMinZoom() {
return bigPointMinZoom;
}
public int getBigPointMaxZoom() {
return bigPointMaxZoom;
}
public void writeToParcel(Parcel out, int flags) { public void writeToParcel(Parcel out, int flags) {
out.writeString(id); out.writeString(id);
out.writeString(name); out.writeString(name);
out.writeFloat(zOrder); out.writeFloat(zOrder);
out.writeTypedList(new ArrayList<>(points.values())); out.writeTypedList(new ArrayList<>(points.values()));
out.writeByte((byte) (imagePoints ? 1 : 0));
out.writeInt(circlePointMinZoom);
out.writeInt(circlePointMaxZoom);
out.writeInt(smallPointMinZoom);
out.writeInt(smallPointMaxZoom);
out.writeInt(bigPointMinZoom);
out.writeInt(bigPointMaxZoom);
} }
private void readFromParcel(Parcel in) { private void readFromParcel(Parcel in) {
@ -90,6 +161,13 @@ public class AMapLayer implements Parcelable {
for (AMapPoint p : pointList) { for (AMapPoint p : pointList) {
this.points.put(p.getId(), p); this.points.put(p.getId(), p);
} }
imagePoints = in.readByte() == 1;
circlePointMinZoom = in.readInt();
circlePointMaxZoom = in.readInt();
smallPointMinZoom = in.readInt();
smallPointMaxZoom = in.readInt();
bigPointMinZoom = in.readInt();
bigPointMaxZoom = in.readInt();
} }
public int describeContents() { public int describeContents() {

View file

@ -11,7 +11,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
public class AMapPoint implements Parcelable { public class AMapPoint implements Parcelable {
public static final int POINT_IMAGE_SIZE_PX = 160;
public static final String POINT_IMAGE_URI_PARAM = "point_image_uri_param"; public static final String POINT_IMAGE_URI_PARAM = "point_image_uri_param";
private String id; private String id;

View file

@ -0,0 +1,3 @@
package net.osmand.aidl.navdrawer;
parcelable AddOpenAppNavDrawerItemParams;

View file

@ -0,0 +1,63 @@
package net.osmand.aidl.navdrawer;
import android.os.Parcel;
import android.os.Parcelable;
public class AddOpenAppNavDrawerItemParams implements Parcelable {
private String itemName;
private String appPackage;
private int flags;
public AddOpenAppNavDrawerItemParams(String itemName, String appPackage) {
this(itemName, appPackage, -1);
}
public AddOpenAppNavDrawerItemParams(String itemName, String appPackage, int flags) {
this.itemName = itemName;
this.appPackage = appPackage;
this.flags = flags;
}
protected AddOpenAppNavDrawerItemParams(Parcel in) {
itemName = in.readString();
appPackage = in.readString();
flags = in.readInt();
}
public String getItemName() {
return itemName;
}
public String getAppPackage() {
return appPackage;
}
public int getFlags() {
return flags;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(itemName);
dest.writeString(appPackage);
dest.writeInt(flags);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<AddOpenAppNavDrawerItemParams> CREATOR = new Creator<AddOpenAppNavDrawerItemParams>() {
@Override
public AddOpenAppNavDrawerItemParams createFromParcel(Parcel in) {
return new AddOpenAppNavDrawerItemParams(in);
}
@Override
public AddOpenAppNavDrawerItemParams[] newArray(int size) {
return new AddOpenAppNavDrawerItemParams[size];
}
};
}

View file

@ -8,6 +8,7 @@ import android.content.Context;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import net.osmand.plus.mapmarkers.MapMarkersDbHelper; import net.osmand.plus.mapmarkers.MapMarkersDbHelper;
import net.osmand.plus.osmedit.OsmBugsDbHelper;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
@ -31,7 +32,8 @@ public class OsmandBackupAgent extends BackupAgentHelper {
SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, prefs); SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, prefs);
addHelper("osmand.settings", helper); addHelper("osmand.settings", helper);
FileBackupHelper fileBackupHelper = new FileBackupHelper(this, FavouritesDbHelper.FILE_TO_BACKUP, "../databases/" + MapMarkersDbHelper.DB_NAME); FileBackupHelper fileBackupHelper = new FileBackupHelper(this, FavouritesDbHelper.FILE_TO_BACKUP,
"../databases/" + MapMarkersDbHelper.DB_NAME, "../databases/" + OsmBugsDbHelper.OSMBUGS_DB_NAME);
addHelper("osmand.files", fileBackupHelper); addHelper("osmand.files", fileBackupHelper);
} }

View file

@ -742,6 +742,10 @@ public class OsmandSettings {
public final CommonPreference<Boolean> SHOW_DASHBOARD_ON_START = new BooleanPreference("should_show_dashboard_on_start", false).makeGlobal(); public final CommonPreference<Boolean> SHOW_DASHBOARD_ON_START = new BooleanPreference("should_show_dashboard_on_start", false).makeGlobal();
public final CommonPreference<Boolean> SHOW_DASHBOARD_ON_MAP_SCREEN = new BooleanPreference("show_dashboard_on_map_screen", false).makeGlobal(); public final CommonPreference<Boolean> SHOW_DASHBOARD_ON_MAP_SCREEN = new BooleanPreference("show_dashboard_on_map_screen", false).makeGlobal();
public final CommonPreference<String> API_NAV_DRAWER_ITEM_NAME = new StringPreference("api_nav_drawer_item_name", "").makeGlobal();
public final CommonPreference<String> API_NAV_DRAWER_ITEM_APP_PACKAGE = new StringPreference("api_nav_drawer_item_app_package", "").makeGlobal();
public final CommonPreference<Integer> API_NAV_DRAWER_ITEM_FLAGS = new IntPreference("api_nav_drawer_item_flags", -1).makeGlobal();
public final CommonPreference<Integer> NUMBER_OF_STARTS_FIRST_XMAS_SHOWN = new IntPreference("number_of_starts_first_xmas_shown", 0).makeGlobal(); public final CommonPreference<Integer> NUMBER_OF_STARTS_FIRST_XMAS_SHOWN = new IntPreference("number_of_starts_first_xmas_shown", 0).makeGlobal();
// this value string is synchronized with settings_pref.xml preference name // this value string is synchronized with settings_pref.xml preference name

View file

@ -795,6 +795,8 @@ public class MapActivityActions implements DialogProvider {
} }
}).createItem()); }).createItem());
app.getAidlApi().registerNavDrawerItem(mapActivity, optionsMenuHelper);
optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.layer_map_appearance, mapActivity) optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.layer_map_appearance, mapActivity)
.setIcon(R.drawable.ic_configure_screen_dark) .setIcon(R.drawable.ic_configure_screen_dark)
.setListener(new ContextMenuAdapter.ItemClickListener() { .setListener(new ContextMenuAdapter.ItemClickListener() {

View file

@ -1,10 +1,14 @@
package net.osmand.plus.views; package net.osmand.plus.views;
import android.content.res.Resources;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.PointF; import android.graphics.PointF;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
@ -26,29 +30,47 @@ import net.osmand.plus.widgets.tools.CropCircleTransformation;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import static net.osmand.aidl.maplayer.point.AMapPoint.POINT_IMAGE_SIZE_PX;
public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider, MapTextLayer.MapTextProvider<AMapPoint> { public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider, MapTextLayer.MapTextProvider<AMapPoint> {
private static int POINT_OUTER_COLOR = 0x88555555;
private static final int POINT_OUTER_COLOR = 0x88555555;
private static final float START_ZOOM = 7;
private static final int SMALL_ICON_SIZE_DP = 20;
private static final int BIG_ICON_SIZE_DP = 40;
private final MapActivity map; private final MapActivity map;
private AMapLayer aidlLayer;
private OsmandMapTileView view; private OsmandMapTileView view;
private AMapLayer aidlLayer;
private Paint pointInnerCircle; private Paint pointInnerCircle;
private Paint pointOuter; private Paint pointOuterCircle;
private Paint bitmapPaint; private Paint bitmapPaint;
private final static float startZoom = 7;
private Bitmap circle;
private Bitmap smallIconBg;
private Bitmap bigIconBg;
private Bitmap placeholder;
private int smallIconSize;
private int bigIconSize;
private PointsType pointsType;
private MapTextLayer mapTextLayer; private MapTextLayer mapTextLayer;
private Map<String, Bitmap> pointImages = new ConcurrentHashMap<>(); private Map<String, Bitmap> pointImages = new ConcurrentHashMap<>();
private Set<String> imageRequests = new HashSet<>();
private List<AMapPoint> displayedPoints = new ArrayList<>();
public AidlMapLayer(MapActivity map, AMapLayer aidlLayer) { public AidlMapLayer(MapActivity map, AMapLayer aidlLayer) {
this.map = map; this.map = map;
this.aidlLayer = aidlLayer; this.aidlLayer = aidlLayer;
@ -58,88 +80,119 @@ public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider
public void initLayer(OsmandMapTileView view) { public void initLayer(OsmandMapTileView view) {
this.view = view; this.view = view;
Resources res = view.getResources();
boolean night = map.getMyApplication().getDaynightHelper().isNightMode();
pointInnerCircle = new Paint(); pointInnerCircle = new Paint();
pointInnerCircle.setColor(view.getApplication().getResources().getColor(R.color.poi_background)); pointInnerCircle.setColor(res.getColor(R.color.poi_background));
pointInnerCircle.setStyle(Paint.Style.FILL); pointInnerCircle.setStyle(Paint.Style.FILL);
pointInnerCircle.setAntiAlias(true); pointInnerCircle.setAntiAlias(true);
pointOuter = new Paint(); pointOuterCircle = new Paint();
pointOuter.setColor(POINT_OUTER_COLOR); pointOuterCircle.setColor(POINT_OUTER_COLOR);
pointOuter.setAntiAlias(true); pointOuterCircle.setStyle(Paint.Style.FILL_AND_STROKE);
pointOuter.setStyle(Paint.Style.FILL_AND_STROKE); pointOuterCircle.setAntiAlias(true);
bitmapPaint = new Paint(); bitmapPaint = new Paint();
bitmapPaint.setAntiAlias(true); bitmapPaint.setAntiAlias(true);
bitmapPaint.setDither(true); bitmapPaint.setDither(true);
bitmapPaint.setFilterBitmap(true); bitmapPaint.setFilterBitmap(true);
circle = BitmapFactory.decodeResource(res, R.drawable.map_white_shield_small);
smallIconBg = BitmapFactory.decodeResource(res, night
? R.drawable.map_pin_user_location_small_night : R.drawable.map_pin_user_location_small_day);
bigIconBg = BitmapFactory.decodeResource(res, night
? R.drawable.map_pin_user_location_night : R.drawable.map_pin_user_location_day);
placeholder = BitmapFactory.decodeResource(res, R.drawable.img_user_picture);
smallIconSize = AndroidUtils.dpToPx(map, SMALL_ICON_SIZE_DP);
bigIconSize = AndroidUtils.dpToPx(map, BIG_ICON_SIZE_DP);
mapTextLayer = view.getLayerByClass(MapTextLayer.class); mapTextLayer = view.getLayerByClass(MapTextLayer.class);
} }
private int getRadiusPoi(RotatedTileBox tb) {
int r;
final double zoom = tb.getZoom();
if (zoom < startZoom) {
r = 0;
} else if (zoom <= 11) {
r = 10;
} else if (zoom <= 14) {
r = 12;
} else {
r = 14;
}
return (int) (r * tb.getDensity());
}
private boolean hasBitmap(AMapPoint point) {
String imageUriStr = point.getParams().get(AMapPoint.POINT_IMAGE_URI_PARAM);
return !TextUtils.isEmpty(imageUriStr) && pointImages.containsKey(imageUriStr);
}
@Override @Override
public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { public void onDraw(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
} }
@Override @Override
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
float density = (float) Math.ceil(tileBox.getDensity()); pointsType = getPointsType(tileBox.getZoom());
final int radius = getRadiusPoi(tileBox); if (pointsType == PointsType.INVISIBLE) {
final int maxRadius = (int) (Math.max(radius, POINT_IMAGE_SIZE_PX) + density); mapTextLayer.putData(this, Collections.emptyList());
return;
}
displayedPoints.clear();
imageRequests.clear();
canvas.rotate(-tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY()); canvas.rotate(-tileBox.getRotate(), tileBox.getCenterPixelX(), tileBox.getCenterPixelY());
Set<String> imageRequests = new HashSet<>(); for (AMapPoint point : aidlLayer.getPoints()) {
List<AMapPoint> points = aidlLayer.getPoints();
for (AMapPoint point : points) {
ALatLon l = point.getLocation(); ALatLon l = point.getLocation();
if (l != null) { if (l != null) {
int x = (int) tileBox.getPixXFromLatLon(l.getLatitude(), l.getLongitude()); int x = (int) tileBox.getPixXFromLatLon(l.getLatitude(), l.getLongitude());
int y = (int) tileBox.getPixYFromLatLon(l.getLatitude(), l.getLongitude()); int y = (int) tileBox.getPixYFromLatLon(l.getLatitude(), l.getLongitude());
if (tileBox.containsPoint(x, y, maxRadius)) { if (tileBox.containsPoint(x, y, bigIconSize)) {
boolean hasBitmap = false; Bitmap image = null;
Map<String, String> params = point.getParams(); if (pointsType != PointsType.STANDARD) {
String imageUriStr = params.get(AMapPoint.POINT_IMAGE_URI_PARAM); String imageUri = point.getParams().get(AMapPoint.POINT_IMAGE_URI_PARAM);
if (!TextUtils.isEmpty(imageUriStr)) { if (!TextUtils.isEmpty(imageUri)) {
Bitmap bitmap = pointImages.get(imageUriStr); image = pointImages.get(imageUri);
if (bitmap == null) { if (image == null) {
imageRequests.add(imageUriStr); imageRequests.add(imageUri);
} else {
hasBitmap = true;
canvas.drawBitmap(bitmap, x - bitmap.getHeight() / 2, y - bitmap.getWidth() / 2, bitmapPaint);
}
}
if (!hasBitmap) {
pointInnerCircle.setColor(point.getColor());
pointOuter.setColor(POINT_OUTER_COLOR);
canvas.drawCircle(x, y, radius + density, pointOuter);
canvas.drawCircle(x, y, radius - density, pointInnerCircle);
} }
} }
} }
displayedPoints.add(point);
drawPoint(canvas, x, y, tileBox, point, image);
} }
}
}
if (imageRequests.size() > 0) { if (imageRequests.size() > 0) {
executeTaskInBackground(new PointImageReaderTask(this), imageRequests.toArray(new String[imageRequests.size()])); executeTaskInBackground(new PointImageReaderTask(this), imageRequests.toArray(new String[imageRequests.size()]));
} }
mapTextLayer.putData(this, points); mapTextLayer.putData(this, displayedPoints);
}
private void drawPoint(Canvas canvas, int x, int y, RotatedTileBox tb, AMapPoint point, Bitmap image) {
if (image == null) {
image = placeholder;
}
if (pointsType == PointsType.STANDARD) {
int radius = getRadiusPoi(tb);
float density = tb.getDensity();
pointInnerCircle.setColor(point.getColor());
canvas.drawCircle(x, y, radius + density, pointOuterCircle);
canvas.drawCircle(x, y, radius - density, pointInnerCircle);
} else if (pointsType == PointsType.CIRCLE) {
drawColoredBitmap(canvas, x, y, circle, point.getColor());
} else if (pointsType == PointsType.SMALL_ICON) {
drawColoredBitmap(canvas, x, y, smallIconBg, point.getColor());
bitmapPaint.setColorFilter(null);
canvas.drawBitmap(image, null, getDstRect(x, y, smallIconSize / 2), bitmapPaint);
} else if (pointsType == PointsType.BIG_ICON) {
bitmapPaint.setColorFilter(null);
// FIXME: vertical offset
float vOffset = bigIconBg.getHeight() * 0.9f;
int imageCenterY = (int) (y - vOffset + bigIconBg.getHeight() / 2);
canvas.drawBitmap(bigIconBg, x - bigIconBg.getWidth() / 2, y - vOffset, bitmapPaint);
canvas.drawBitmap(image, null, getDstRect(x, imageCenterY, bigIconSize / 2), bitmapPaint);
}
}
private void drawColoredBitmap(Canvas canvas, int x, int y, Bitmap bitmap, int color) {
bitmapPaint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY));
canvas.drawBitmap(bitmap, x - bitmap.getWidth() / 2, y - bitmap.getHeight() / 2, bitmapPaint);
}
private Rect getDstRect(int centerX, int centerY, int offset) {
Rect rect = new Rect();
rect.left = centerX - offset;
rect.top = centerY - offset;
rect.right = centerX + offset;
rect.bottom = centerY + offset;
return rect;
} }
@Override @Override
@ -151,12 +204,6 @@ public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider
return false; return false;
} }
public void refresh() {
if (view != null) {
view.refreshMap();
}
}
@Override @Override
public boolean disableSingleTap() { public boolean disableSingleTap() {
return false; return false;
@ -207,28 +254,6 @@ public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider
return aidlLayer.getPoint(id); return aidlLayer.getPoint(id);
} }
private void getFromPoint(RotatedTileBox tb, PointF point, List<? super AMapPoint> points) {
if (view != null) {
int ex = (int) point.x;
int ey = (int) point.y;
final int rp = getRadiusPoi(tb);
final int bitmapRadius = (int) ((POINT_IMAGE_SIZE_PX / tb.getDensity()) * 3 / 2);
int compare;
int radius = rp * 3 / 2;
for (AMapPoint p : aidlLayer.getPoints()) {
ALatLon position = p.getLocation();
if (position != null) {
compare = hasBitmap(p) ? bitmapRadius : radius;
int x = (int) tb.getPixXFromLatLon(position.getLatitude(), position.getLongitude());
int y = (int) tb.getPixYFromLatLon(position.getLatitude(), position.getLongitude());
if (Math.abs(x - ex) <= compare && Math.abs(y - ey) <= compare) {
points.add(p);
}
}
}
}
}
@Override @Override
public LatLon getTextLocation(AMapPoint o) { public LatLon getTextLocation(AMapPoint o) {
ALatLon loc = o.getLocation(); ALatLon loc = o.getLocation();
@ -240,11 +265,16 @@ public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider
@Override @Override
public int getTextShift(AMapPoint o, RotatedTileBox rb) { public int getTextShift(AMapPoint o, RotatedTileBox rb) {
int radius = getRadiusPoi(rb); if (pointsType == PointsType.STANDARD) {
if (hasBitmap(o)) { return (int) (getRadiusPoi(rb) * 1.5);
return (int) (POINT_IMAGE_SIZE_PX * 0.6); } else if (pointsType == PointsType.CIRCLE) {
return (int) (circle.getHeight() * 0.6);
} else if (pointsType == PointsType.SMALL_ICON) {
return smallIconBg.getHeight() / 2;
} else if (pointsType == PointsType.BIG_ICON) {
return bigIconBg.getHeight() / 6;
} }
return (int) (radius * 1.5); return 0;
} }
@Override @Override
@ -262,6 +292,81 @@ public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider
return true; return true;
} }
public void refresh() {
if (view != null) {
view.refreshMap();
}
}
private PointsType getPointsType(int zoom) {
if (!aidlLayer.isImagePoints()) {
return zoom >= START_ZOOM ? PointsType.STANDARD : PointsType.INVISIBLE;
}
if (zoom >= aidlLayer.getCirclePointMinZoom() && zoom <= aidlLayer.getCirclePointMaxZoom()) {
return PointsType.CIRCLE;
} else if (zoom >= aidlLayer.getSmallPointMinZoom() && zoom <= aidlLayer.getSmallPointMaxZoom()) {
return PointsType.SMALL_ICON;
} else if (zoom >= aidlLayer.getBigPointMinZoom() && zoom <= aidlLayer.getBigPointMaxZoom()) {
return PointsType.BIG_ICON;
}
return PointsType.INVISIBLE;
}
private int getRadiusPoi(RotatedTileBox tb) {
int r;
final double zoom = tb.getZoom();
if (zoom < START_ZOOM) {
r = 0;
} else if (zoom <= 11) {
r = 10;
} else if (zoom <= 14) {
r = 12;
} else {
r = 14;
}
return (int) (r * tb.getDensity());
}
private int getPointRadius(RotatedTileBox tb) {
int r = 0;
if (pointsType == PointsType.STANDARD) {
r = getRadiusPoi(tb);
} else if (pointsType == PointsType.CIRCLE) {
r = circle.getHeight() / 2;
} else if (pointsType == PointsType.SMALL_ICON) {
r = smallIconSize / 2;
} else if (pointsType == PointsType.BIG_ICON) {
r = bigIconSize / 2;
}
return r * 3 / 2;
}
private void getFromPoint(RotatedTileBox tb, PointF point, List<? super AMapPoint> points) {
if (view != null) {
int ex = (int) point.x;
int ey = (int) point.y;
int radius = getPointRadius(tb);
for (AMapPoint p : aidlLayer.getPoints()) {
ALatLon position = p.getLocation();
if (position != null) {
int x = (int) tb.getPixXFromLatLon(position.getLatitude(), position.getLongitude());
int y = (int) tb.getPixYFromLatLon(position.getLatitude(), position.getLongitude());
if (Math.abs(x - ex) <= radius && Math.abs(y - ey) <= radius) {
points.add(p);
}
}
}
}
}
private enum PointsType {
STANDARD,
CIRCLE,
SMALL_ICON,
BIG_ICON,
INVISIBLE
}
private static class PointImageReaderTask extends AsyncTask<String, Void, Boolean> { private static class PointImageReaderTask extends AsyncTask<String, Void, Boolean> {
private WeakReference<AidlMapLayer> layerRef; private WeakReference<AidlMapLayer> layerRef;
@ -285,8 +390,8 @@ public class AidlMapLayer extends OsmandMapLayer implements IContextMenuProvider
Bitmap bitmap = BitmapFactory.decodeStream(ims); Bitmap bitmap = BitmapFactory.decodeStream(ims);
if (bitmap != null) { if (bitmap != null) {
bitmap = circleTransformation.transform(bitmap); bitmap = circleTransformation.transform(bitmap);
if (bitmap.getWidth() != POINT_IMAGE_SIZE_PX || bitmap.getHeight() != POINT_IMAGE_SIZE_PX) { if (bitmap.getWidth() != layer.bigIconSize || bitmap.getHeight() != layer.bigIconSize) {
bitmap = AndroidUtils.scaleBitmap(bitmap, POINT_IMAGE_SIZE_PX, POINT_IMAGE_SIZE_PX, false); bitmap = AndroidUtils.scaleBitmap(bitmap, layer.bigIconSize, layer.bigIconSize, false);
} }
layer.pointImages.put(imageUriStr, bitmap); layer.pointImages.put(imageUriStr, bitmap);
res = true; res = true;