Merge pull request #4703 from igrechuhin/release-65-to-master

Release 65 to master
This commit is contained in:
Roman Kuznetsov 2016-11-11 14:09:50 +03:00 committed by GitHub
commit 5953d7c0f6
138 changed files with 5216 additions and 2546 deletions

View file

@ -19,7 +19,7 @@ jclass g_bookmarkClazz;
jclass g_myTrackerClazz;
jclass g_httpClientClazz;
jclass g_httpParamsClazz;
jclass g_socketWrapperClazz;
jclass g_platformSocketClazz;
jclass g_utilsClazz;
extern "C"
@ -37,7 +37,7 @@ JNI_OnLoad(JavaVM * jvm, void *)
g_myTrackerClazz = jni::GetGlobalClassRef(env, "com/my/tracker/MyTracker");
g_httpClientClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/HttpClient");
g_httpParamsClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/HttpClient$Params");
g_socketWrapperClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/location/SocketWrapper");
g_platformSocketClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/location/PlatformSocket");
g_utilsClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/Utils");
return JNI_VERSION_1_6;
@ -53,7 +53,7 @@ JNI_OnUnload(JavaVM *, void *)
env->DeleteGlobalRef(g_myTrackerClazz);
env->DeleteGlobalRef(g_httpClientClazz);
env->DeleteGlobalRef(g_httpParamsClazz);
env->DeleteGlobalRef(g_socketWrapperClazz);
env->DeleteGlobalRef(g_platformSocketClazz);
env->DeleteGlobalRef(g_utilsClazz);
}
} // extern "C"

View file

@ -14,7 +14,7 @@ extern jclass g_bookmarkClazz;
extern jclass g_myTrackerClazz;
extern jclass g_httpClientClazz;
extern jclass g_httpParamsClazz;
extern jclass g_socketWrapperClazz;
extern jclass g_platformSocketClazz;
extern jclass g_utilsClazz;
namespace jni

View file

@ -670,8 +670,9 @@ Java_com_mapswithme_maps_Framework_nativeGetDistanceAndAzimuthFromLatLon(
JNIEXPORT jobject JNICALL
Java_com_mapswithme_maps_Framework_nativeFormatLatLon(JNIEnv * env, jclass, jdouble lat, jdouble lon, jboolean useDMSFormat)
{
return jni::ToJavaString(env, (useDMSFormat ? measurement_utils::FormatLatLonAsDMS(lat, lon, 2)
: measurement_utils::FormatLatLon(lat, lon, 6)));
return jni::ToJavaString(
env, (useDMSFormat ? measurement_utils::FormatLatLonAsDMS(lat, lon, 2)
: measurement_utils::FormatLatLon(lat, lon, true /* withSemicolon */, 6)));
}
JNIEXPORT jobjectArray JNICALL

View file

@ -36,7 +36,7 @@ JNIEXPORT void JNICALL
Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeShowBookmarkOnMap(
JNIEnv * env, jobject thiz, jint c, jint b)
{
BookmarkAndCategory bnc = BookmarkAndCategory(b,c);
BookmarkAndCategory bnc = BookmarkAndCategory(b, c);
frm()->ShowBookmark(bnc);
}
@ -109,7 +109,7 @@ Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastE
size_t const lastEditedCategory = f->LastEditedBMCategory();
size_t const createdBookmarkIndex = f->AddBookmark(lastEditedCategory, glbPoint, bmkData);
place_page::Info & info = g_framework->GetPlacePageInfo();
info.m_bac = {lastEditedCategory, createdBookmarkIndex};
info.m_bac = {createdBookmarkIndex, lastEditedCategory};
return usermark_helper::CreateMapObject(env, info);
}

View file

@ -10,8 +10,8 @@ public:
SocketImpl()
{
JNIEnv * env = jni::GetEnv();
static jmethodID const socketConstructor = jni::GetConstructorID(env, g_socketWrapperClazz, "()V");
jni::TScopedLocalRef localSelf(env, env->NewObject(g_socketWrapperClazz, socketConstructor));
static jmethodID const socketConstructor = jni::GetConstructorID(env, g_platformSocketClazz, "()V");
jni::TScopedLocalRef localSelf(env, env->NewObject(g_platformSocketClazz, socketConstructor));
m_self = env->NewGlobalRef(localSelf.get());
ASSERT(m_self, ());
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 995 B

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 708 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View file

@ -9,6 +9,11 @@
android:visibility="invisible"
tools:visibility="visible">
<WebView
android:id="@+id/wv__bookmark_notes"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv__bookmark_notes"
android:layout_width="match_parent"

View file

@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/start"
android:layout_width="@dimen/start_button_width"
android:layout_height="match_parent"
android:layout_gravity="center"
android:text="@string/p2p_start"
style="@style/MwmWidget.Button.Start"
android:textAppearance="@style/MwmTextAppearance.Body1"
tools:showIn="@layout/menu_route_plan_line"/>
<Button
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/start"
android:layout_width="wrap_content"
android:minWidth="@dimen/start_button_width"
android:padding="@dimen/margin_half"
android:layout_height="match_parent"
android:layout_gravity="center"
android:text="@string/p2p_start"
style="@style/MwmWidget.Button.Start"
android:textAppearance="@style/MwmTextAppearance.Body1"
tools:showIn="@layout/menu_route_plan_line"/>

View file

@ -721,7 +721,7 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">لغات أخرى</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">إظهار المزيد</string>
<string name="show_more">إظهار أكثر</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">إظهار أقل</string>
<string name="add_language">إضافة لغة</string>
@ -953,4 +953,44 @@
<string name="whats_new_route_profile_message">بالنسبة لمسارات المشاة والدراجات نحن الآن نعرض تشكيل الارتفاع.</string>
<string name="whats_new_booking_improve_title">توفير عند حجز الفنادق</string>
<string name="whats_new_booking_improve_message">تحتوي نتائج البحث عن الفنادق الآن على فئة السعر.\nوأضفنا أيضًا أكثر من 110000 فندق.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">مرافق</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">قريبة</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">ترتيب</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">متوقع في %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">لا يمكن العثور على تاكسي قريب</string>
<string name="install_app">تثبيت</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">عامل التصفية</string>
<string name="booking_filters_reset">إعادة تعيين</string>
<string name="booking_filters_rating">تصنيف</string>
<string name="booking_filters_rating_any">أي</string>
<string name="booking_filters_ragting_good">جيد</string>
<string name="booking_filters_rating_very_good">جيد جداً</string>
<string name="booking_filters_rating_excellent">ممتاز</string>
<string name="booking_filters_price_category">فئة الأسعار</string>
<string name="booking_filters_no_results">لم يتم العثور على نتائج</string>
<string name="booking_filters_nores_message">جرب مصطلح بحث أكثر عمومية أو التصغير أو إعادة تعيين عامل التصفية.</string>
<string name="booking_filters_expand_area_button">تصغير</string>
<string name="booking_filters_reset_button">إعادة تعيين عامل التصفية</string>
<!-- noun -->
<string name="booking_list">قائمة</string>
<string name="booking_based_on_reviews">استناداً إلى %d من مراجعات الفنادق</string>
<string name="booking_show_more">إظهار المزيد</string>
<string name="booking_reviews">المراجعات</string>
<string name="booking_hotel">الفندق</string>
<!-- hotel room -->
<string name="booking_hotel_room">الغرفة</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">فتح</string>
<string name="whatsnew_uber_header">MAPS.ME وUber</string>
<string name="whatsnew_uber_message">اطلب تاكسي Uber مباشرة من التطبيق!</string>
<string name="dialog_taxi_offline">طلب تاكسي غير متاح في وضع الطيران.</string>
<string name="dialog_taxi_error">طلب تاكسي غير متاح مؤقتا.</string>
</resources>

View file

@ -722,9 +722,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Další jazyky</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Zobrazit více</string>
<string name="show_more">Zobrazit méně</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Zobrazit méně</string>
<string name="show_less">Zobrazit více</string>
<string name="add_language">Přidat jazyk</string>
<string name="street">Ulice</string>
<!-- Editable House Number text field (in address block). -->
@ -954,4 +954,44 @@
<string name="whats_new_route_profile_message">U pěších a cyklistických tras nyní zobrazujeme výškový profil.</string>
<string name="whats_new_booking_improve_title">Ušetřete při rezervaci hotelů</string>
<string name="whats_new_booking_improve_message">Výsledky hledání hotelů nyní obsahují cenové kategorie. \nTaké jsme přidali více než 110 000 hotelů.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Vybavení</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Nedaleké</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Objednat</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Očekávaný příjezd za %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Nelze najít taxi v okolí</string>
<string name="install_app">Instalovat</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filtr</string>
<string name="booking_filters_reset">Reset</string>
<string name="booking_filters_rating">Hodnocení</string>
<string name="booking_filters_rating_any">Jakékoli</string>
<string name="booking_filters_ragting_good">Dobré</string>
<string name="booking_filters_rating_very_good">Velmi dobré</string>
<string name="booking_filters_rating_excellent">Vynikající</string>
<string name="booking_filters_price_category">Cenová kategorie</string>
<string name="booking_filters_no_results">Nebyly nalezeny žádné výsledky</string>
<string name="booking_filters_nores_message">Zkuste obecnější hledaný výraz, oddálit nebo obnovit filtr.</string>
<string name="booking_filters_expand_area_button">Oddálit</string>
<string name="booking_filters_reset_button">Resetovat filtr</string>
<!-- noun -->
<string name="booking_list">Seznam</string>
<string name="booking_based_on_reviews">Podle %d hodnocení hotelů</string>
<string name="booking_show_more">Zobrazit více</string>
<string name="booking_reviews">Hodnocení</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Pokoj</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Otevřít</string>
<string name="whatsnew_uber_header">MAPS.ME a Uber</string>
<string name="whatsnew_uber_message">Objednejte si taxi Uber přímo z aplikace!</string>
<string name="dialog_taxi_offline">Objednání taxi není v režimu offline k dispozici.</string>
<string name="dialog_taxi_error">Objednání taxi není dočasně k dispozici.</string>
</resources>

View file

@ -951,4 +951,44 @@
<string name="whats_new_route_profile_message">Vi viser nu højdeprofilen for fodgænger- og cykelruter.</string>
<string name="whats_new_booking_improve_title">Spar penge når du bestiller hotelværelser</string>
<string name="whats_new_booking_improve_message">Søgeresultater for hoteller viser nu også priskategorien.\nVi har desuden tilføjet mere end 110.000 hoteller.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Faciliteter</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">I nærheden</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Bestil</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Forventes om %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Kunne ikke finde en taxi i nærheden</string>
<string name="install_app">Installer</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filter</string>
<string name="booking_filters_reset">Nulstil</string>
<string name="booking_filters_rating">Vurdering</string>
<string name="booking_filters_rating_any">Hvilken som helst</string>
<string name="booking_filters_ragting_good">God</string>
<string name="booking_filters_rating_very_good">Meget god</string>
<string name="booking_filters_rating_excellent">Fremragende</string>
<string name="booking_filters_price_category">Prisklasse</string>
<string name="booking_filters_no_results">Ingen resultater fundet</string>
<string name="booking_filters_nores_message">Prøv et mere generelt søgeudtryk, zoom ud eller nulstil filteret.</string>
<string name="booking_filters_expand_area_button">Zoom ud</string>
<string name="booking_filters_reset_button">Nulstil Filter</string>
<!-- noun -->
<string name="booking_list">Liste</string>
<string name="booking_based_on_reviews">Baseret på %d hotelanmeldelser</string>
<string name="booking_show_more">Vis mere</string>
<string name="booking_reviews">Anmeldelser</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Værelse</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Åbn</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Bestil Uber taxi direkte fra app\&#39;en!</string>
<string name="dialog_taxi_offline">Det er ikke muligt at bestille en taxi i offlinetilstand.</string>
<string name="dialog_taxi_error">Bestilling af en taxi er ikke muligt lige nu.</string>
</resources>

View file

@ -965,4 +965,44 @@
<string name="whats_new_route_profile_message">Für Fußgänger- und Fahrradrouten zeigen wir nun das Höhenprofil an.</string>
<string name="whats_new_booking_improve_title">Beim Buchen von Hotels sparen</string>
<string name="whats_new_booking_improve_message">Suchergebnisse für Hotels enthalten jetzt die Kategorie Preis.\nAußerdem haben wir über 110.000 Hotels hinzugefügt.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Ausstattung</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">In der Nähe</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Bestellen</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Erwartet in %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Es konnte kein Taxi in der Nähe gefunden werden</string>
<string name="install_app">Installieren</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filter</string>
<string name="booking_filters_reset">Zurücksetzen</string>
<string name="booking_filters_rating">Bewertung</string>
<string name="booking_filters_rating_any">Alle</string>
<string name="booking_filters_ragting_good">Gut</string>
<string name="booking_filters_rating_very_good">Sehr gut</string>
<string name="booking_filters_rating_excellent">Ausgezeichnet</string>
<string name="booking_filters_price_category">Preiskategorie</string>
<string name="booking_filters_no_results">Keine Ergebnisse gefunden</string>
<string name="booking_filters_nores_message">Versuchen Sie es mit einem allgemeineren Suchbegriff, zoomen Sie heraus oder setzen Sie den Filter zurück.</string>
<string name="booking_filters_expand_area_button">Herauszoomen</string>
<string name="booking_filters_reset_button">Filter zurücksetzen</string>
<!-- noun -->
<string name="booking_list">Liste</string>
<string name="booking_based_on_reviews">Basierend auf %d Hotelbewertungen</string>
<string name="booking_show_more">Mehr anzeigen</string>
<string name="booking_reviews">Bewertungen</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Zimmer</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Öffnen</string>
<string name="whatsnew_uber_header">MAPS.ME und Uber</string>
<string name="whatsnew_uber_message">Uber-Taxi direkt über die App bestellen!</string>
<string name="dialog_taxi_offline">Das Bestellen eines Taxis ist im Offline-Modus nicht verfügbar.</string>
<string name="dialog_taxi_error">Das Bestellen eines Taxis ist vorübergehend nicht verfügbar.</string>
</resources>

View file

@ -759,7 +759,7 @@
<string name="placepage_report_problem_button">Informar de un problema</string>
<string name="placepage_add_business_button">Añadir organización</string>
<string name="whatsnew_smallmwm_header">Llevas tiempo pidiéndolo y lo hemos hecho</string>
<string name="whatsnew_smallmwm_message">Hemos dividido el mapa por partes. Ahora, puedes descargar regiones individuales, en vez de el país entero.</string>
<string name="whatsnew_smallmwm_message">Hemos dividido el mapa por partes. Ahora, puedes descargar regiones individuales, en vez del país entero.</string>
<string name="whatsnew_search_header">Nueva búsqueda</string>
<string name="whatsnew_search_message">Hemos mejorado notablemente la búsqueda por dirección. Compruébalo.</string>
<string name="whatsnew_editor_title">Editar el mapa*</string>
@ -940,4 +940,44 @@
<string name="whats_new_route_profile_message">Ahora se muestra el perfil de elevación en los itinerarios pedestres y en bicicleta.</string>
<string name="whats_new_booking_improve_title">Ahorrar al reservar hoteles</string>
<string name="whats_new_booking_improve_message">La búsqueda de resultados de hoteles ahora contiene la categoría de precios.\nHemos añadido más de 110 000 hoteles.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Instalaciones</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Cercano</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Pedir</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Se espera en %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">No se puede encontrar un taxi cerca</string>
<string name="install_app">Instalar</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filtrar</string>
<string name="booking_filters_reset">Restablecer</string>
<string name="booking_filters_rating">Clasificación</string>
<string name="booking_filters_rating_any">Cualquier</string>
<string name="booking_filters_ragting_good">Bueno</string>
<string name="booking_filters_rating_very_good">Muy bueno</string>
<string name="booking_filters_rating_excellent">Excelente</string>
<string name="booking_filters_price_category">Categoría de precios</string>
<string name="booking_filters_no_results">No se han encontrado resultados</string>
<string name="booking_filters_nores_message">Pruebe un término de búsqueda general, aléjese o restablezca el filtro.</string>
<string name="booking_filters_expand_area_button">Alejarse</string>
<string name="booking_filters_reset_button">Restablecer filtro</string>
<!-- noun -->
<string name="booking_list">Lista</string>
<string name="booking_based_on_reviews">Basado en %d reseñas de hoteles</string>
<string name="booking_show_more">Mostrar más</string>
<string name="booking_reviews">Reseñas</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Habitación</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Abrir</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">¡Pide un taxi Uber directamente desde la aplicación!</string>
<string name="dialog_taxi_offline">La opción para solicitar un taxi no se encuentra disponible en el modo sin conexión.</string>
<string name="dialog_taxi_error">La opción para solicitar un taxi se encuentra temporalmente no disponible.</string>
</resources>

View file

@ -715,7 +715,7 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Muut Kielet</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Näytä lisää</string>
<string name="show_more">Näytä enemmän</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Näytä vähemmän</string>
<string name="add_language">Lisää kieli</string>
@ -947,4 +947,44 @@
<string name="whats_new_route_profile_message">Näytämme nyt maaston korkeuden kävely- ja pyöräilyreittejä varten.</string>
<string name="whats_new_booking_improve_title">Säästä hotellivarauksissa</string>
<string name="whats_new_booking_improve_message">Hotellien hakutuloksissa näkyy nyt hintakategoria.\nLisäsimme myös yli 110 000 hotellia.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Palvelut</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Lähellä</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Tilaa</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Saapumiseen arviolta %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Läheltä ei löytynyt taksia</string>
<string name="install_app">Asenna</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Suodatin</string>
<string name="booking_filters_reset">Palauta</string>
<string name="booking_filters_rating">Arvio</string>
<string name="booking_filters_rating_any">Kaikki</string>
<string name="booking_filters_ragting_good">Hyvä</string>
<string name="booking_filters_rating_very_good">Todella hyvä</string>
<string name="booking_filters_rating_excellent">Erinomainen</string>
<string name="booking_filters_price_category">Hintaluokka</string>
<string name="booking_filters_no_results">Ei hakutuloksia</string>
<string name="booking_filters_nores_message">Kokeile yleisempää hakusanaa, loitonna tai palauta suodatin.</string>
<string name="booking_filters_expand_area_button">Loitonna</string>
<string name="booking_filters_reset_button">Palauta suodatin</string>
<!-- noun -->
<string name="booking_list">Luettelo</string>
<string name="booking_based_on_reviews">Perustuu %d hotelliarvioon</string>
<string name="booking_show_more">Näytä lisää</string>
<string name="booking_reviews">Arviot</string>
<string name="booking_hotel">Hotelli</string>
<!-- hotel room -->
<string name="booking_hotel_room">Huone</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Avaa</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Tilaa Uber -taksi suoraan sovelluksesta!</string>
<string name="dialog_taxi_offline">Taksin tilaaminen ei ole mahdollista ilman verkkoyhteyttä.</string>
<string name="dialog_taxi_error">Taksin tilaaminen ei ole tällä hetkellä mahdollista.</string>
</resources>

View file

@ -732,9 +732,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Autres langues</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Afficher plus</string>
<string name="show_more">Montrer plus</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Afficher moins</string>
<string name="show_less">Montrer moins</string>
<string name="add_language">Ajouter une langue</string>
<string name="street">Rue</string>
<!-- Editable House Number text field (in address block). -->
@ -964,4 +964,44 @@
<string name="whats_new_route_profile_message">Pour les routes pédestres et cyclables nous affichons maintenant le profil d\&#39;élévation.</string>
<string name="whats_new_booking_improve_title">Économisez de l\&#39;argent en réservant des hôtels</string>
<string name="whats_new_booking_improve_message">Les résultats des recherches d\&#39;hôtels comprennent maintenant la catégorie de prix.\nNous avons aussi ajouté plus de 110.000 hôtels.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Installations</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">À proximité</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Commander</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Attendu dans %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Impossible de trouver un taxi à proximité</string>
<string name="install_app">Installer</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filtrer</string>
<string name="booking_filters_reset">Réinitialiser</string>
<string name="booking_filters_rating">Note</string>
<string name="booking_filters_rating_any">Nimporte quel</string>
<string name="booking_filters_ragting_good">Bon</string>
<string name="booking_filters_rating_very_good">Très bon</string>
<string name="booking_filters_rating_excellent">Excellent</string>
<string name="booking_filters_price_category">Catégorie de prix</string>
<string name="booking_filters_no_results">Aucun résultat trouvé</string>
<string name="booking_filters_nores_message">Essayez un terme de recherche plus général , effectuez un zoom arrière ou réinitialisez le filtre.</string>
<string name="booking_filters_expand_area_button">Zoom arrière</string>
<string name="booking_filters_reset_button">Réinitialiser le filtre</string>
<!-- noun -->
<string name="booking_list">Liste</string>
<string name="booking_based_on_reviews">Basé sur %d revues d\&#39;hôtels</string>
<string name="booking_show_more">Afficher plus</string>
<string name="booking_reviews">Revues</string>
<string name="booking_hotel">Hôtel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Chambre</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Ouvrir</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Commandez un taxi directement depuis l\&#39;appli !</string>
<string name="dialog_taxi_offline">La commande d\&#39;un taxi n\&#39;est pas disponible en mode hors ligne.</string>
<string name="dialog_taxi_error">La commande d\&#39;un taxi est temporairement indisponible.</string>
</resources>

View file

@ -716,9 +716,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Más nyelv</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Továbbiak megjelenítése</string>
<string name="show_more">Több mutatása</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Kevesebb megjelenítése</string>
<string name="show_less">Kevesebb mutatása</string>
<string name="add_language">Nyelv hozzáadása</string>
<string name="street">Utca</string>
<!-- Editable House Number text field (in address block). -->
@ -947,4 +947,44 @@
<string name="whats_new_route_profile_message">A gyalogos és kerékpáros utakat most már emelkedési profillal jelenítjük meg.</string>
<string name="whats_new_booking_improve_title">Takarékoskodjon szálláshely foglalásakor</string>
<string name="whats_new_booking_improve_message">A szálláshely keresési eredménye már tartalmazza az árkategóriát. \nEmellett kiegészítettük több mint 110.000 szálláshellyel.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Létesítmények</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Közeli</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Rendelés</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Várható %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Nem talált taxit a közelben</string>
<string name="install_app">Telepítés</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Szűrő</string>
<string name="booking_filters_reset">Alaphelyzetbe állítás</string>
<string name="booking_filters_rating">Minősítés</string>
<string name="booking_filters_rating_any">Bármelyik</string>
<string name="booking_filters_ragting_good"></string>
<string name="booking_filters_rating_very_good">Nagyon jó</string>
<string name="booking_filters_rating_excellent">Kiváló</string>
<string name="booking_filters_price_category">Árkategória</string>
<string name="booking_filters_no_results">Nincs találat</string>
<string name="booking_filters_nores_message">Próbálkozzon általánosabb kereső kifejezéssel, tágítsa vagy törölje a szűrőt.</string>
<string name="booking_filters_expand_area_button">Kicsinyítés</string>
<string name="booking_filters_reset_button">Szűrő nullázása</string>
<!-- noun -->
<string name="booking_list">Lista</string>
<string name="booking_based_on_reviews">%d hotel-értékelés alapján</string>
<string name="booking_show_more">Több megjelenítése</string>
<string name="booking_reviews">Bírálatok</string>
<string name="booking_hotel">Szálloda</string>
<!-- hotel room -->
<string name="booking_hotel_room">Szoba</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Megnyitás</string>
<string name="whatsnew_uber_header">MAPS.ME és Uber</string>
<string name="whatsnew_uber_message">Hívj Uber-taxit közvetlenül az alkalmazásból!</string>
<string name="dialog_taxi_offline">Taxirendelés offline módban nem lehetséges.</string>
<string name="dialog_taxi_error">A taxirendelés átmenetileg nem elérhető.</string>
</resources>

View file

@ -714,9 +714,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Bahasa lainnya</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Selengkapnya</string>
<string name="show_more">Tampilkan lebih banyak</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Kurangi</string>
<string name="show_less">Tampilkan lebih sedikit</string>
<string name="add_language">Tambahkan bahasa</string>
<string name="street">Jalan</string>
<!-- Editable House Number text field (in address block). -->
@ -946,4 +946,44 @@
<string name="whats_new_route_profile_message">Untuk rute pejalan kaki dan sepeda, kami kini menampilkan profil elevasi.</string>
<string name="whats_new_booking_improve_title">Berhemat saat memesan hotel</string>
<string name="whats_new_booking_improve_message">Hasil pencarian untuk hotel kini disertai kategori harga.\nKami juga menambahkan lebih dari 110.000 hotel.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Fasilitas</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Dekat</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Pesan</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Diharapkan dalam %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Tidak dapat menemukan taksi di dekat lokasi</string>
<string name="install_app">Pasang</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filter</string>
<string name="booking_filters_reset">Atur ulang</string>
<string name="booking_filters_rating">Peringkat</string>
<string name="booking_filters_rating_any">Apa saja</string>
<string name="booking_filters_ragting_good">Bagus</string>
<string name="booking_filters_rating_very_good">Sangat Bagus</string>
<string name="booking_filters_rating_excellent">Luar Biasa</string>
<string name="booking_filters_price_category">Kategori Harga</string>
<string name="booking_filters_no_results">Tidak Ada Hasil</string>
<string name="booking_filters_nores_message">Cobalah dengan istilah pencarian yang lebih umum, perkecil atau atur ulang filter.</string>
<string name="booking_filters_expand_area_button">Perkecil</string>
<string name="booking_filters_reset_button">Atur Ulang Filter</string>
<!-- noun -->
<string name="booking_list">Daftar</string>
<string name="booking_based_on_reviews">Berdasarkan %d ulasan hotel</string>
<string name="booking_show_more">Selengkapnya</string>
<string name="booking_reviews">Ulasan</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Kamar</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Buka</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Pesan taksi Uber langsung dari aplikasi!</string>
<string name="dialog_taxi_offline">Memesan taksi tidak tersedia dalam modus offline.</string>
<string name="dialog_taxi_error">Memesan taksi untuk sementara tidak tersedia.</string>
</resources>

View file

@ -714,7 +714,7 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Altre lingue</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Mostra altro</string>
<string name="show_more">Mostra più</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Mostra meno</string>
<string name="add_language">Aggiungi una lingua</string>
@ -946,4 +946,44 @@
<string name="whats_new_route_profile_message">Per gli itinerari pedonali e ciclabili, è ora visualizzato il profilo altimetrico.</string>
<string name="whats_new_booking_improve_title">Risparmia alla prenotazione degli hotel</string>
<string name="whats_new_booking_improve_message">I risultati della ricerca per gli hotel contengono ora la categoria di prezzo.\nInoltre, abbiamo aggiunto più di 110.000 hotel.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Servizi</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Nelle vicinanze</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Prenota</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Atteso in %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Impossibile trovare un taxi nelle vicinanze</string>
<string name="install_app">Installa</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filtro</string>
<string name="booking_filters_reset">Reimposta</string>
<string name="booking_filters_rating">Voto</string>
<string name="booking_filters_rating_any">Qualsiasi</string>
<string name="booking_filters_ragting_good">Buono</string>
<string name="booking_filters_rating_very_good">Molto buono</string>
<string name="booking_filters_rating_excellent">Eccellente</string>
<string name="booking_filters_price_category">Categoria di prezzo</string>
<string name="booking_filters_no_results">Nessun risultato trovato</string>
<string name="booking_filters_nores_message">Prova con un termine di ricerca più generale, fai lo zoom indietro o reimposta il filtro.</string>
<string name="booking_filters_expand_area_button">Zoom indietro</string>
<string name="booking_filters_reset_button">Reimposta filtro</string>
<!-- noun -->
<string name="booking_list">Elenco</string>
<string name="booking_based_on_reviews">Basato su %d recensioni d\&#39;hotel</string>
<string name="booking_show_more">Mostra altro</string>
<string name="booking_reviews">Recensioni</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Camera</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">GeoChat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Apri</string>
<string name="whatsnew_uber_header">MAPS.ME e Uber</string>
<string name="whatsnew_uber_message">Prenota un taxi Uber direttamente dalla app!</string>
<string name="dialog_taxi_offline">La chiamata taxi non è disponibile in modalità offline.</string>
<string name="dialog_taxi_error">La chiamata taxi è temporaneamente non disponibile.</string>
</resources>

View file

@ -714,9 +714,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">その他の言語</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">表示を増やす</string>
<string name="show_more">もっと表示</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">表示を減らす</string>
<string name="show_less">少なく表示</string>
<string name="add_language">言語を追加</string>
<string name="street">通り</string>
<!-- Editable House Number text field (in address block). -->
@ -946,4 +946,44 @@
<string name="whats_new_route_profile_message">歩行者とバイク用のルートに高度プロファイルが表示されるようになりました。</string>
<string name="whats_new_booking_improve_title">ホテル予約時に節約しましょう</string>
<string name="whats_new_booking_improve_message">ホテルの検索結果に価格のカテゴリーが表示されるようになりました。\nさらに、 110,000 軒を超えるホテルを追加しました。</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">施設</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">近隣</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">予約</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">%s 後に到着予定</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">近隣にタクシーは見つかりませんでした</string>
<string name="install_app">インストール</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">フィルター</string>
<string name="booking_filters_reset">リセット</string>
<string name="booking_filters_rating">評価</string>
<string name="booking_filters_rating_any">すべて</string>
<string name="booking_filters_ragting_good">良い</string>
<string name="booking_filters_rating_very_good">非常に良い</string>
<string name="booking_filters_rating_excellent">最高</string>
<string name="booking_filters_price_category">価格帯</string>
<string name="booking_filters_no_results">結果が見つかりません</string>
<string name="booking_filters_nores_message">一般的な検索語句や、フィルター範囲を広げたりリセットしたりしてください。</string>
<string name="booking_filters_expand_area_button">広げる</string>
<string name="booking_filters_reset_button">フィルターをリセット</string>
<!-- noun -->
<string name="booking_list">一覧</string>
<string name="booking_based_on_reviews">%d 件のホテルのレビューに基づいています</string>
<string name="booking_show_more">さらに表示</string>
<string name="booking_reviews">レビュー</string>
<string name="booking_hotel">ホテル</string>
<!-- hotel room -->
<string name="booking_hotel_room">部屋</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">ジオチャット</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">開始</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">アプリから直接Uberの配車リクエストができます</string>
<string name="dialog_taxi_offline">タクシーの予約がオフラインモードでは使用できません。</string>
<string name="dialog_taxi_error">タクシーの予約が一時的に使用できません。</string>
</resources>

View file

@ -711,9 +711,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">다른 언어</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">자세히 표시</string>
<string name="show_more">더 많이 표시</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">간단히 표시</string>
<string name="show_less">더 적게 표시</string>
<string name="add_language">언어 추가</string>
<string name="street">거리</string>
<!-- Editable House Number text field (in address block). -->
@ -943,4 +943,44 @@
<string name="whats_new_route_profile_message">보행자 및 자전거 도로를 위해 이제 고도 단면을 표시합니다.</string>
<string name="whats_new_booking_improve_title">호텔 예약 시 절약</string>
<string name="whats_new_booking_improve_message">이제 가격 범주를 포함하는 호텔에 대한 결과를 검색하세요.\n또한 110,000곳 이상의 호텔이 추가되었습니다.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">시설</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">근처</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">주문</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">%s 예상</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">근처에서 택시를 찾을 수 없음</string>
<string name="install_app">설치</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">필터</string>
<string name="booking_filters_reset">재설정</string>
<string name="booking_filters_rating">평가</string>
<string name="booking_filters_rating_any">모두</string>
<string name="booking_filters_ragting_good">양호</string>
<string name="booking_filters_rating_very_good">매우 양호</string>
<string name="booking_filters_rating_excellent">탁월</string>
<string name="booking_filters_price_category">가격 범주</string>
<string name="booking_filters_no_results">결과 찾지 못함</string>
<string name="booking_filters_nores_message">보다 일반적인 검색어로 시도하거나, 축소하거나, 필터를 재설정하세요.</string>
<string name="booking_filters_expand_area_button">축소</string>
<string name="booking_filters_reset_button">필터 재설정</string>
<!-- noun -->
<string name="booking_list">목록</string>
<string name="booking_based_on_reviews">%d개 호텔 리뷰 기반</string>
<string name="booking_show_more">자세히 표시</string>
<string name="booking_reviews">리뷰</string>
<string name="booking_hotel">호텔</string>
<!-- hotel room -->
<string name="booking_hotel_room">객실</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">열기</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Uber 택시를 직접 앱에서 예약하세요.</string>
<string name="dialog_taxi_offline">오프라인 모드에서는 택시를 예약할 수 없습니다.</string>
<string name="dialog_taxi_error">일시적으로 택시를 예약할 수 없습니다.</string>
</resources>

View file

@ -945,4 +945,42 @@
<string name="whats_new_route_profile_message">Vi viser nå høydeprofilen med tanke på gå- og sykkelruter.</string>
<string name="whats_new_booking_improve_title">Spar penger når du bestiller hotell</string>
<string name="whats_new_booking_improve_message">Søkeresultatene for hoteller inneholder nå priskategori.\nVi har også lagt til flere enn 110.000 hoteller.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Fasiliteter</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">I nærheten</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Bestille</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Kunne ikke finne drosje i nærheten</string>
<string name="install_app">Installer</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filter</string>
<string name="booking_filters_reset">Tilbakestille</string>
<string name="booking_filters_rating">Vurdering</string>
<string name="booking_filters_rating_any">Hvilken som helst</string>
<string name="booking_filters_ragting_good">Bra</string>
<string name="booking_filters_rating_very_good">Veldig bra</string>
<string name="booking_filters_rating_excellent">Utmerket</string>
<string name="booking_filters_price_category">Prisklasse</string>
<string name="booking_filters_no_results">Fant ingen resultater</string>
<string name="booking_filters_nores_message">Prøv et mer generelt søkeord, zoom ut eller tilbakestill filteret.</string>
<string name="booking_filters_expand_area_button">Zoom ut</string>
<string name="booking_filters_reset_button">Tilbakestill filter</string>
<!-- noun -->
<string name="booking_list">Liste</string>
<string name="booking_based_on_reviews">Basert på %d hotellvurderinger</string>
<string name="booking_show_more">Vis mer</string>
<string name="booking_reviews">Vurderinger</string>
<string name="booking_hotel">Hotell</string>
<!-- hotel room -->
<string name="booking_hotel_room">Rom</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Åpne</string>
<string name="whatsnew_uber_header">MAPS.ME og Uber</string>
<string name="whatsnew_uber_message">Bestill en Uber-drosje direkte fra appen!</string>
<string name="dialog_taxi_offline">Bestilling av taxi er ikke mulig i offlinemodus.</string>
<string name="dialog_taxi_error">Bestilling av taxi er ikke tilgjengelig for øyeblikket.</string>
</resources>

View file

@ -715,9 +715,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Overige talen</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Meer Tonen</string>
<string name="show_more">Laat meer zien</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Minder Tonen</string>
<string name="show_less">Laat minder zien</string>
<string name="add_language">Een taal toevoegen</string>
<string name="street">Straat</string>
<!-- Editable House Number text field (in address block). -->
@ -947,4 +947,44 @@
<string name="whats_new_route_profile_message">Voor wandel- en fietsroutes geven we nu het hoogteprofiel weer.</string>
<string name="whats_new_booking_improve_title">Bespaar op het boeken van hotels</string>
<string name="whats_new_booking_improve_message">Zoekresultaten voor hotels bevatten nu de prijscategorie.\nWe hebben ook meer dan 110.000 hotels toegevoegd.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Faciliteiten</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">In de buurt</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Bestellen</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Verwacht binnen %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Kon geen taxi vinden in de buurt</string>
<string name="install_app">Installeer</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filter</string>
<string name="booking_filters_reset">Resetten</string>
<string name="booking_filters_rating">Beoordeling</string>
<string name="booking_filters_rating_any">Alle</string>
<string name="booking_filters_ragting_good">Goed</string>
<string name="booking_filters_rating_very_good">Heel Goed</string>
<string name="booking_filters_rating_excellent">Uitstekend</string>
<string name="booking_filters_price_category">Prijscategorie</string>
<string name="booking_filters_no_results">Geen Resultaten Gevonden</string>
<string name="booking_filters_nores_message">Probeer een meer algemene zoekterm, zoom uit of reset de filter.</string>
<string name="booking_filters_expand_area_button">Uitzoomen</string>
<string name="booking_filters_reset_button">Filter Resetten</string>
<!-- noun -->
<string name="booking_list">Lijst</string>
<string name="booking_based_on_reviews">Gebaseerd op %d hotelbeoordelingen</string>
<string name="booking_show_more">Meer weergeven</string>
<string name="booking_reviews">Beoordelingen</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Kamer</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Openen</string>
<string name="whatsnew_uber_header">MAPS.ME en Uber</string>
<string name="whatsnew_uber_message">Bestel een Uber-taxi rechtstreeks vanuit de app!</string>
<string name="dialog_taxi_offline">Het bestellen van een taxi is niet beschikbaar in de offline modus.</string>
<string name="dialog_taxi_error">Het bestellen van een taxi is tijdelijk niet beschikbaar.</string>
</resources>

View file

@ -954,4 +954,44 @@
<string name="whats_new_route_profile_message">Dla tras pieszych i rowerowych pokazujemy teraz też profil wysokościowy.</string>
<string name="whats_new_booking_improve_title">Oszczędzaj przy rezerwacji hotelów</string>
<string name="whats_new_booking_improve_message">Wyniki wyszukiwania hoteli zawierają teraz kategorię cenową. \nDodaliśmy też ponad 110 000 hoteli.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Obiekty hotelowe</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">W pobliżu</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Zamów</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Szacunkowo przybędzie za %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Nie można znaleźć taksówki w pobliżu</string>
<string name="install_app">Zainstaluj</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filtr</string>
<string name="booking_filters_reset">Resetuj</string>
<string name="booking_filters_rating">Ocena</string>
<string name="booking_filters_rating_any">Wszelkie</string>
<string name="booking_filters_ragting_good">Dobrze</string>
<string name="booking_filters_rating_very_good">Bardzo dobrze</string>
<string name="booking_filters_rating_excellent">Doskonale</string>
<string name="booking_filters_price_category">Kategoria cenowa</string>
<string name="booking_filters_no_results">Nie znaleziono wyników</string>
<string name="booking_filters_nores_message">Spróbuj szerszego terminu wyszukiwania, zawęzić lub resetować filtr.</string>
<string name="booking_filters_expand_area_button">Zawęź</string>
<string name="booking_filters_reset_button">Resetuj filtr</string>
<!-- noun -->
<string name="booking_list">Lista</string>
<string name="booking_based_on_reviews">Na podstawie %d opinii o hotelach</string>
<string name="booking_show_more">Pokaż więcej</string>
<string name="booking_reviews">Opinie</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Pokój</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Otwórz</string>
<string name="whatsnew_uber_header">MAPS.ME i Uber</string>
<string name="whatsnew_uber_message">Zamów taksówkę Uber bezpośrednio z aplikacji!</string>
<string name="dialog_taxi_offline">Zamawianie taksówek nie jest dostępne w trybie offline.</string>
<string name="dialog_taxi_error">Zamawianie taksówek jest tymczasowo niedostępne.</string>
</resources>

View file

@ -716,7 +716,7 @@
<!-- small button to open list with names in different languages -->
<string name="show_more">Mostrar mais</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Mostrar Menos</string>
<string name="show_less">Mostrar menos</string>
<string name="add_language">Adicionar um idioma</string>
<string name="street">Rua</string>
<!-- Editable House Number text field (in address block). -->
@ -946,4 +946,44 @@
<string name="whats_new_route_profile_message">Nas rotas para peões e ciclovias apresentamos agora o perfil de elevação.</string>
<string name="whats_new_booking_improve_title">Poupe nas reservas de hotéis</string>
<string name="whats_new_booking_improve_message">Agora, os resultados da pesquisa de hotéis contêm a categoria de preços.\nAdicinámos mais de 110.000 hotéis.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Instalações</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Nas proximidades</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Encomendar</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Esperado em %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Não consegui encontrar um táxi nas proximidades</string>
<string name="install_app">Instalar</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filtrar</string>
<string name="booking_filters_reset">Redefinir</string>
<string name="booking_filters_rating">Classificação</string>
<string name="booking_filters_rating_any">Qualquer</string>
<string name="booking_filters_ragting_good">Bom</string>
<string name="booking_filters_rating_very_good">Muito bom</string>
<string name="booking_filters_rating_excellent">Excelente</string>
<string name="booking_filters_price_category">Categoria de preços</string>
<string name="booking_filters_no_results">Nenhum resultado encontrado</string>
<string name="booking_filters_nores_message">Tente um termo de pesquisa mais geral, diminuir o zoom ou redefinir o filtro.</string>
<string name="booking_filters_expand_area_button">Diminuir o zoom</string>
<string name="booking_filters_reset_button">Redefinir o filtro</string>
<!-- noun -->
<string name="booking_list">Lista</string>
<string name="booking_based_on_reviews">Com base em %d análises de hotel</string>
<string name="booking_show_more">Mostrar mais</string>
<string name="booking_reviews">Comentários</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Quarto</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Abrir</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Chame um táxi Uber diretamente do aplicativo!</string>
<string name="dialog_taxi_offline">O serviço de táxi não está disponível no modo off-line.</string>
<string name="dialog_taxi_error">O serviço de táxi está temporariamente indisponível.</string>
</resources>

View file

@ -712,9 +712,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Alte limbi</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Arată mai multe</string>
<string name="show_more">Afișează mai mult</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Arată mai puține</string>
<string name="show_less">Afișează mai puțin</string>
<string name="add_language">Adăugare limbă</string>
<string name="street">Stradă</string>
<!-- Editable House Number text field (in address block). -->
@ -943,4 +943,44 @@
<string name="whats_new_route_profile_message">Pentru rutele pentru pietoni și bicicliști, afișam acum profilul de elevație.</string>
<string name="whats_new_booking_improve_title">Economisiți bani când rezervați hoteluri</string>
<string name="whats_new_booking_improve_message">Rezultatele de căutare pentru hoteluri conțin acum categoria de preț. \nAm mai adăugat și peste 110.000 de hoteluri.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Facilităţi</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">În apropiere</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Comandă</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Așteptat în %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Nu am găsit niciun taxi în apropiere\u0020</string>
<string name="install_app">Instalați</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filtrare</string>
<string name="booking_filters_reset">Resetare</string>
<string name="booking_filters_rating">Clasificare</string>
<string name="booking_filters_rating_any">Oricare</string>
<string name="booking_filters_ragting_good">Bine</string>
<string name="booking_filters_rating_very_good">Foarte bine</string>
<string name="booking_filters_rating_excellent">Excelent</string>
<string name="booking_filters_price_category">Categorie de preț</string>
<string name="booking_filters_no_results">Nu au fost găsite rezultate</string>
<string name="booking_filters_nores_message">Încercați un termen mai general, micșorați sau resetați filtrul.</string>
<string name="booking_filters_expand_area_button">Micșorare</string>
<string name="booking_filters_reset_button">Resetare filtru</string>
<!-- noun -->
<string name="booking_list">Listă</string>
<string name="booking_based_on_reviews">Bazat pe comentariile privind hotelul %d</string>
<string name="booking_show_more">Arată mai multe</string>
<string name="booking_reviews">Comentarii</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Cameră</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Deschideți</string>
<string name="whatsnew_uber_header">MAPS.ME și Uber</string>
<string name="whatsnew_uber_message">Comandați un taxi Uber direct din aplicație!</string>
<string name="dialog_taxi_offline">Comandarea unui taxi nu se poate face în modul offline.</string>
<string name="dialog_taxi_error">Comandarea unui taxi este momentan indisponibilă.</string>
</resources>

View file

@ -990,12 +990,20 @@
<string name="booking_filters_nores_message">Попробуйте задать более общий запрос, уменьшить масштаб карты или сбросить фильтр.</string>
<string name="booking_filters_expand_area_button">Уменьшить масштаб карты</string>
<string name="booking_filters_reset_button">Сбросить фильтр</string>
<!-- noun -->
<string name="booking_list">Список</string>
<string name="booking_based_on_reviews">По %d отзывам об отеле</string>
<string name="booking_show_more">Показать еще</string>
<string name="booking_reviews">Отзывы</string>
<string name="booking_hotel">Отель</string>
<!-- hotel room -->
<string name="booking_hotel_room">Номер</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Геочат</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Открыть</string>
<string name="whatsnew_uber_header">MAPS.ME и Uber</string>
<string name="whatsnew_uber_message">Закажите такси прямо из приложения!</string>
<string name="dialog_taxi_offline">Заказ такси недоступен офлайн.</string>
<string name="dialog_taxi_error">Заказ такси временно недоступен.</string>
</resources>

View file

@ -718,9 +718,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Iné jazyky</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Ukázať viac</string>
<string name="show_more">Zobraziť viac</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Ukázať menej</string>
<string name="show_less">Zobraziť menej</string>
<string name="add_language">Pridať jazyk</string>
<string name="street">Ulica</string>
<!-- Editable House Number text field (in address block). -->
@ -950,4 +950,44 @@
<string name="whats_new_route_profile_message">Pre pešie trasy a cyklotrasy sa odteraz zobrazuje aj výškový profil.</string>
<string name="whats_new_booking_improve_title">Ušetriť pri rezervácii hotelov</string>
<string name="whats_new_booking_improve_message">Výsledky vyhľadávania hotelov odteraz obsahujú aj cenové kategórie. \nTiež sme pridali viac ako 110 000 hotelov.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Zariadenia</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">V blízkosti</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Objednať</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Očakávaný príjazd o %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">V okolí sa nepodarilo nájsť žiaden taxík</string>
<string name="install_app">Nainštalovať</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filter</string>
<string name="booking_filters_reset">Obnoviť</string>
<string name="booking_filters_rating">Hodnotenie</string>
<string name="booking_filters_rating_any">Akékoľvek</string>
<string name="booking_filters_ragting_good">Dobré</string>
<string name="booking_filters_rating_very_good">Veľmi dobré</string>
<string name="booking_filters_rating_excellent">Výborné</string>
<string name="booking_filters_price_category">Cenová kategória</string>
<string name="booking_filters_no_results">Nenašli sa žiadne výsledky</string>
<string name="booking_filters_nores_message">Skúste vyhľadávať všeobecnejší výraz, vzdialiť alebo obnoviť nastavenie filtra.</string>
<string name="booking_filters_expand_area_button">Vzdialiť</string>
<string name="booking_filters_reset_button">Obnoviť filter</string>
<!-- noun -->
<string name="booking_list">Zoznam</string>
<string name="booking_based_on_reviews">Na základe %d recenzií</string>
<string name="booking_show_more">Zobraziť viac</string>
<string name="booking_reviews">Recenzie</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Izba</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">GeoChat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Otvoriť</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Objednajte si Uber priamo z aplikácie!</string>
<string name="dialog_taxi_offline">Objednanie taxíka nie je k dispozícii v režime offline.</string>
<string name="dialog_taxi_error">Objednanie taxíka je dočasne nedostupné.</string>
</resources>

View file

@ -951,4 +951,44 @@
<string name="whats_new_route_profile_message">För gångvägar och cykelturer visar vi nu höjdprofilen.</string>
<string name="whats_new_booking_improve_title">Spara pengar när du bokar hotell</string>
<string name="whats_new_booking_improve_message">Sökresultat för hotell innehåller nu priskategorin.\nVi har även lagt till över 110 000 hotell.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Faciliteter</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">I närheten</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Boka</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Förväntas om %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Hittade ingen taxi i närheten</string>
<string name="install_app">Installera</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filter</string>
<string name="booking_filters_reset">Återställ</string>
<string name="booking_filters_rating">Betyg</string>
<string name="booking_filters_rating_any">Vilket som helst</string>
<string name="booking_filters_ragting_good">Bra</string>
<string name="booking_filters_rating_very_good">Väldigt bra</string>
<string name="booking_filters_rating_excellent">Utmärkt</string>
<string name="booking_filters_price_category">Priskategori</string>
<string name="booking_filters_no_results">Inga resultat hittades</string>
<string name="booking_filters_nores_message">Försök med en mer allmän sökterm, zooma ut eller återställ filtret.</string>
<string name="booking_filters_expand_area_button">Zooma ut</string>
<string name="booking_filters_reset_button">Återställ filtret</string>
<!-- noun -->
<string name="booking_list">Lista</string>
<string name="booking_based_on_reviews">Baserat på %d hotellomdömen</string>
<string name="booking_show_more">Visa fler</string>
<string name="booking_reviews">Omdömen</string>
<string name="booking_hotel">Hotell</string>
<!-- hotel room -->
<string name="booking_hotel_room">Rum</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Öppna</string>
<string name="whatsnew_uber_header">MAPS.ME och Uber</string>
<string name="whatsnew_uber_message">Beställ en Uber direkt från appen!</string>
<string name="dialog_taxi_offline">Du kan inte beställa en taxi i offlineläge.</string>
<string name="dialog_taxi_error">Du kan inte beställa en taxi just nu.</string>
</resources>

View file

@ -721,7 +721,7 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">ภาษาอื่น ๆ</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">แสดงเพิ่มเติม</string>
<string name="show_more">แสดงมากขึ้น</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">แสดงน้อยลง</string>
<string name="add_language">เพิ่มภาษา</string>
@ -953,4 +953,44 @@
<string name="whats_new_route_profile_message">สำหรับเส้นทางคนเดินเท้าและจักรยาน ตอนนี้เราแสดงโปรไฟล์ระดับความสูงแล้ว</string>
<string name="whats_new_booking_improve_title">ประหยัดเมื่อจองโรงแรม</string>
<string name="whats_new_booking_improve_message">การค้นหาโรงแรมตอนนี้มีหมวดหมู่ราคาแล้ว\nเรายังได้เพิ่มโรงแรมเข้ามากว่า 110,000 โรงแรมอีกด้วย</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">สิ่งอำนวยความสะดวก</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">บริเวณใกล้เคียง</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">สั่ง</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">คาดว่าภายใน %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">ไม่พบแท็กซี่ในบริเวณใกล้เคียง</string>
<string name="install_app">ติดตั้ง</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">ตัวกรอง</string>
<string name="booking_filters_reset">รีเซ็ต</string>
<string name="booking_filters_rating">อันดับ</string>
<string name="booking_filters_rating_any">อะไรก็ได้</string>
<string name="booking_filters_ragting_good">ดี</string>
<string name="booking_filters_rating_very_good">ดีมาก</string>
<string name="booking_filters_rating_excellent">ยอดเยี่ยม</string>
<string name="booking_filters_price_category">หมวดหมู่ราคา</string>
<string name="booking_filters_no_results">ไม่พบผลลัพธ์</string>
<string name="booking_filters_nores_message">ลองค้นหาด้วยคำทั่ว ๆ ไปดู ซูมออกหรือรีเซ็ตตัวกรอง</string>
<string name="booking_filters_expand_area_button">ซูมออก</string>
<string name="booking_filters_reset_button">รีเซ็ตตัวกรอง</string>
<!-- noun -->
<string name="booking_list">รายการ</string>
<string name="booking_based_on_reviews">ตาม %d รีวิวโรงแรม</string>
<string name="booking_show_more">แสดงเพิ่มเติม</string>
<string name="booking_reviews">รีวิว</string>
<string name="booking_hotel">โรงแรม</string>
<!-- hotel room -->
<string name="booking_hotel_room">ห้องพัก</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">เปิด</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">เรียกแท็กซี่ Uber โดยตรงจากแอป!</string>
<string name="dialog_taxi_offline">ไม่สามารถทำการจองแท็กซี่ได้ในโหมดออฟไลน์</string>
<string name="dialog_taxi_error">ไม่สามารถทำการจองแท็กซี่ได้ชั่วคราว</string>
</resources>

View file

@ -721,9 +721,9 @@
<!-- title above languages list cells in the editor, below editable name text field. -->
<string name="other_languages">Diğer Diller</string>
<!-- small button to open list with names in different languages -->
<string name="show_more">Daha fazla göster</string>
<string name="show_more">Daha fazlasını göster</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">Daha az göster</string>
<string name="show_less">Daha azını göster</string>
<string name="add_language">Bir dil ekle</string>
<string name="street">Sokak</string>
<!-- Editable House Number text field (in address block). -->
@ -953,4 +953,44 @@
<string name="whats_new_route_profile_message">Yürüyüş ve bisiklet yolları şimdi yükseklik profilli olarak görüntüleniyor.</string>
<string name="whats_new_booking_improve_title">Otel rezervasyonlarınızdan tasarruf edin</string>
<string name="whats_new_booking_improve_message">Artık otel arama sonuçlarında fiyat kategorisi de gösteriliyor.\nVe 110,000\&#39;den fazla oteli sistemimize ekledik.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Tesisler</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Yakınlarda</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Çağır</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">%s içinde bekleniyor</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Yakın hiç taksi bulunamadı</string>
<string name="install_app">Kur</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Filtre</string>
<string name="booking_filters_reset">Sıfırla</string>
<string name="booking_filters_rating">Oy Verin</string>
<string name="booking_filters_rating_any">Herhangi biri</string>
<string name="booking_filters_ragting_good">İyi</string>
<string name="booking_filters_rating_very_good">Çok iyi</string>
<string name="booking_filters_rating_excellent">Mükemmel</string>
<string name="booking_filters_price_category">Fiyat Kategorisi</string>
<string name="booking_filters_no_results">Hiçbir Sonuç Bulunamadı</string>
<string name="booking_filters_nores_message">Daha genel bir terimi aramayı deneyin, uzaklaşın veya filtreyi Sıfırlayın.</string>
<string name="booking_filters_expand_area_button">Uzaklaş</string>
<string name="booking_filters_reset_button">Filtreyi Sıfırla</string>
<!-- noun -->
<string name="booking_list">Liste</string>
<string name="booking_based_on_reviews">%d otel değerlendirmesine göre</string>
<string name="booking_show_more">Daha fazla göster</string>
<string name="booking_reviews">Değerlendirmeler</string>
<string name="booking_hotel">Otel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Oda</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">GeoChat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open"></string>
<string name="whatsnew_uber_header">MAPS.ME ve Uber</string>
<string name="whatsnew_uber_message">Doğrudan uygulamadan Uber taksi isteyin!</string>
<string name="dialog_taxi_offline">Taksi çağırma çevrimdışı modda kullanılamıyor.</string>
<string name="dialog_taxi_error">Taksi çağırma geçici olarak kullanılamıyor.</string>
</resources>

View file

@ -951,4 +951,44 @@
<string name="whats_new_route_profile_message">Для пішохідних і велосипедних маршрутів тепер відображається профіль рельєфу.</string>
<string name="whats_new_booking_improve_title">Заощаджуйте на бронюванні готелів</string>
<string name="whats_new_booking_improve_message">В результатах пошуку готелів на карті відображається цінова категорія.\nКрім того, тепер у нашій базі даних з\&#39;явилося 110 000 нових готелів.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Зручності</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Поблизу</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Замовити</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Очікується через %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Не вдалося знайти таксі поблизу</string>
<string name="install_app">Встановити</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Фільтр</string>
<string name="booking_filters_reset">Скинути</string>
<string name="booking_filters_rating">Рейтинг</string>
<string name="booking_filters_rating_any">Будь-який</string>
<string name="booking_filters_ragting_good">Добре</string>
<string name="booking_filters_rating_very_good">Дуже добре</string>
<string name="booking_filters_rating_excellent">Чудово</string>
<string name="booking_filters_price_category">Цінова категорія</string>
<string name="booking_filters_no_results">Не знайдено жодного результату</string>
<string name="booking_filters_nores_message">Спробуйте пошук за більш узагальненим пошуковим виразом, зменшіть масштаб або скиньте фільтри.</string>
<string name="booking_filters_expand_area_button">Зменшити масштаб</string>
<string name="booking_filters_reset_button">Скинути фільтри</string>
<!-- noun -->
<string name="booking_list">Список</string>
<string name="booking_based_on_reviews">На основі %d відгуків(-у) про готель</string>
<string name="booking_show_more">Показати більше</string>
<string name="booking_reviews">Відгуки</string>
<string name="booking_hotel">Готель</string>
<!-- hotel room -->
<string name="booking_hotel_room">Номер</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Геочат</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Відкрити</string>
<string name="whatsnew_uber_header">MAPS.ME і Uber</string>
<string name="whatsnew_uber_message">Замовляйте таксі прямо з додатку!</string>
<string name="dialog_taxi_offline">Замовлення таксі неможливе в автономному режимі.</string>
<string name="dialog_taxi_error">Замовлення таксі тимчасово недоступне.</string>
</resources>

View file

@ -947,4 +947,44 @@
<string name="whats_new_route_profile_message">Đối với các đường đi bộ và đi xe đạp, chúng tôi hiện đã hiển thị mặt cắt tầng.</string>
<string name="whats_new_booking_improve_title">Tiết kiệm khi đặt khách sạn</string>
<string name="whats_new_booking_improve_message">Kết quả tìm kiếm cho khách sạn giờ đã có bậc giá cả.\nChúng tôi cũng đã bổ sung hơn 110.000 khách sạn.</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">Cơ sở</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">Gần đây</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">Đặt xe</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">Sẽ đến trong %s</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">Không thể tìm thấy một taxi ở gần đây</string>
<string name="install_app">Cài đặt</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">Bộ lọc</string>
<string name="booking_filters_reset">Đặt lại</string>
<string name="booking_filters_rating">Cho điểm</string>
<string name="booking_filters_rating_any">Bất kỳ</string>
<string name="booking_filters_ragting_good">Tốt</string>
<string name="booking_filters_rating_very_good">Rất tốt</string>
<string name="booking_filters_rating_excellent">Xuất sắc</string>
<string name="booking_filters_price_category">Hạng mục Giá</string>
<string name="booking_filters_no_results">Không tìm thấy kết quả nào</string>
<string name="booking_filters_nores_message">Hãy thử một từ khóa tìm kiếm chung hơn, thu nhỏ hoặc đặt lại bộ lọc.</string>
<string name="booking_filters_expand_area_button">Thu nhỏ</string>
<string name="booking_filters_reset_button">Đặt lại Bộ lọc</string>
<!-- noun -->
<string name="booking_list">Danh sách</string>
<string name="booking_based_on_reviews">Dựa trên %d đánh giá khách sạn</string>
<string name="booking_show_more">Hiển thị thêm</string>
<string name="booking_reviews">Đánh giá</string>
<string name="booking_hotel">Khách sạn</string>
<!-- hotel room -->
<string name="booking_hotel_room">Phòng</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Mở</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Đặt taxi Uber trực tiếp từ ứng dụng!</string>
<string name="dialog_taxi_offline">Gọi taxi không khả dụng trong chế độ ngoại tuyến.</string>
<string name="dialog_taxi_error">Gọi taxi tạm thời không khả dụng.</string>
</resources>

View file

@ -729,7 +729,7 @@
<!-- small button to open list with names in different languages -->
<string name="show_more">顯示更多</string>
<!-- small button to close list with names in different languages -->
<string name="show_less">顯示</string>
<string name="show_less">顯示</string>
<string name="add_language">新增語言</string>
<string name="street">街道</string>
<!-- Editable House Number text field (in address block). -->
@ -959,4 +959,44 @@
<string name="whats_new_route_profile_message">對於行人和自行車路線,我們現在顯示海拔剖面圖。</string>
<string name="whats_new_booking_improve_title">優惠預訂飯店</string>
<string name="whats_new_booking_improve_message">飯店搜尋結果現在還包含價格類別。\n我們還加入了超過 110,000 間飯店。</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">設施</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">附近</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">預約</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">預計 %s 內到達</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">無法在附近找到計程車</string>
<string name="install_app">安裝</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">篩選條件</string>
<string name="booking_filters_reset">重設</string>
<string name="booking_filters_rating">評分</string>
<string name="booking_filters_rating_any">任意</string>
<string name="booking_filters_ragting_good"></string>
<string name="booking_filters_rating_very_good">很好</string>
<string name="booking_filters_rating_excellent">極好</string>
<string name="booking_filters_price_category">價格類別</string>
<string name="booking_filters_no_results">找不到任何結果</string>
<string name="booking_filters_nores_message">嘗試一個更普通的搜尋字詞、縮小顯示或重設篩選條件。</string>
<string name="booking_filters_expand_area_button">縮小</string>
<string name="booking_filters_reset_button">重設篩選條件</string>
<!-- noun -->
<string name="booking_list">清單</string>
<string name="booking_based_on_reviews">根據 %d 則飯店評論</string>
<string name="booking_show_more">顯示更多</string>
<string name="booking_reviews">評論</string>
<string name="booking_hotel">飯店</string>
<!-- hotel room -->
<string name="booking_hotel_room">客房</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">開放</string>
<string name="whatsnew_uber_header">優步 &amp; MAPS.ME離綫地圖</string>
<string name="whatsnew_uber_message">直接從應用程序預訂計程車!</string>
<string name="dialog_taxi_offline">叫計程車服務在離線模式下無法使用。</string>
<string name="dialog_taxi_error">叫計程車服務暫時無法使用。</string>
</resources>

View file

@ -953,4 +953,44 @@
<string name="whats_new_route_profile_message">对于行人和自行车路线,我们现在显示纵剖面。</string>
<string name="whats_new_booking_improve_title">优惠预订酒店</string>
<string name="whats_new_booking_improve_message">酒店的搜索结果现在包含价格类别。\n我们还添加了超过 110,000 家酒店。</string>
<!-- For place page hotel facilities block -->
<string name="placepage_hotel_facilities">设施</string>
<!-- For place page hotel nearby block -->
<string name="placepage_hotel_nearby">附近</string>
<!-- For ordering a taxi (as opposed to hotels or other things) -->
<string name="taxi_order">预订</string>
<!-- How long it is until the taxi arrives -->
<string name="taxi_wait">预计 %s后到达</string>
<!-- When there are no available taxis nearby -->
<string name="taxi_not_found">无法在附近找到出租车</string>
<string name="install_app">安装</string>
<!-- `Filter` is a noun here -->
<string name="booking_filters">筛选器</string>
<string name="booking_filters_reset">重置</string>
<string name="booking_filters_rating">评分</string>
<string name="booking_filters_rating_any">任意</string>
<string name="booking_filters_ragting_good"></string>
<string name="booking_filters_rating_very_good">很好</string>
<string name="booking_filters_rating_excellent">极好</string>
<string name="booking_filters_price_category">价格类别</string>
<string name="booking_filters_no_results">未找到任何结果</string>
<string name="booking_filters_nores_message">尝试一个更普通的搜索词、缩小显示或重置筛选器。</string>
<string name="booking_filters_expand_area_button">缩小</string>
<string name="booking_filters_reset_button">重置筛选器</string>
<!-- noun -->
<string name="booking_list">列表</string>
<string name="booking_based_on_reviews">根据 %d 条酒店点评</string>
<string name="booking_show_more">显示更多</string>
<string name="booking_reviews">点评</string>
<string name="booking_hotel">酒店</string>
<!-- hotel room -->
<string name="booking_hotel_room">客房</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">开放</string>
<string name="whatsnew_uber_header">优步和MAPS.ME</string>
<string name="whatsnew_uber_message">从应用直接叫优步出租车!</string>
<string name="dialog_taxi_offline">叫出租车服务在离线模式下无法使用。</string>
<string name="dialog_taxi_error">叫出租车服务暂时无法使用。</string>
</resources>

View file

@ -29,18 +29,15 @@
<!-- What's new -->
<integer-array name="news_images">
<item>@drawable/ic_img_whatsnew_route_profile</item>
<item>@drawable/ic_img_whatsnew_booking_improve</item>
<item>@drawable/img_whatsnew_uber</item>
</integer-array>
<string-array name="news_titles">
<item>@string/whats_new_route_profile_title</item>
<item>@string/whats_new_booking_improve_title</item>
<item>@string/whatsnew_uber_header</item>
</string-array>
<string-array name="news_messages_1">
<item>@string/whats_new_route_profile_message</item>
<item>@string/whats_new_booking_improve_message</item>
<item>@string/whatsnew_uber_message</item>
</string-array>
<string-array name="news_messages_2">

View file

@ -994,15 +994,20 @@
<string name="booking_filters_nores_message">Try a more general search term, zoom out or reset the filter.</string>
<string name="booking_filters_expand_area_button">Zoom out</string>
<string name="booking_filters_reset_button">Reset Filter</string>
<!-- noun -->
<string name="booking_list">List</string>
<string name="booking_based_on_reviews">Based on %d hotel reviews</string>
<string name="booking_show_more">Show more</string>
<string name="booking_reviews">Reviews</string>
<string name="booking_hotel">Hotel</string>
<!-- hotel room -->
<string name="booking_hotel_room">Room</string>
<!-- A neologism for a chat based on geographical proximity -->
<string name="chat">Geochat</string>
<!-- Verb. Text on a button that opens the chat. -->
<string name="chat_open">Open</string>
<!-- TODO: it's temporary -->
<string name="uber_no_internet">Internet connection is required to order taxi</string>
<string name="uber_remote_error">Uber is unavailable</string>
<string name="whatsnew_uber_header">MAPS.ME &amp; Uber</string>
<string name="whatsnew_uber_message">Order a taxi directly from the app!</string>
<string name="dialog_taxi_offline">Taxi ordering is unavailable in offline mode.</string>
<string name="dialog_taxi_error">Taxi ordering is temporarily unavailable.</string>
</resources>

View file

@ -10,11 +10,11 @@
<item name="android:textColorSecondary">@color/text_dark_subtitle</item>
<item name="android:windowBackground">?windowBackgroundForced</item>
<item name="android:colorPrimaryDark" tools:targetApi="lollipop">@color/bg_statusbar</item>
<item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="lollipop">true</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
<item name="android:fontFamily" tools:targetApi="jelly_bean">@string/robotoRegular</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="clickableBackground">?selectableItemBackground</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
<item name="alertDialogTheme">@style/MwmTheme.DialogFragment</item>
<item name="windowBackgroundForced">@color/bg_window</item>
@ -22,7 +22,6 @@
<item name="cardBackground">@color/bg_cards</item>
<item name="fullscreenDialogTheme">@style/MwmTheme.DialogFragment.Fullscreen</item>
<item name="statusBar">@color/bg_statusbar</item>
<item name="colorPrimary">@color/bg_primary</item>
<item name="colorControlNormal">?secondary</item>
<item name="colorAccent">@color/base_accent</item>
@ -95,11 +94,11 @@
<item name="android:textColorSecondary">@color/text_light_subtitle</item>
<item name="android:windowBackground">?windowBackgroundForced</item>
<item name="android:colorPrimaryDark" tools:targetApi="lollipop">?statusBar</item>
<item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="lollipop">true</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
<item name="android:fontFamily" tools:targetApi="jelly_bean">@string/robotoRegular</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="clickableBackground">?selectableItemBackground</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
<item name="alertDialogTheme">@style/MwmTheme.Night.DialogFragment</item>
<item name="windowBackgroundForced">@color/bg_window_night</item>
@ -107,7 +106,6 @@
<item name="cardBackground">@color/bg_cards_night</item>
<item name="fullscreenDialogTheme">@style/MwmTheme.DialogFragment.Fullscreen.Night</item>
<item name="statusBar">@color/bg_statusbar_night</item>
<item name="colorPrimary">@color/bg_primary_night</item>
<item name="colorControlNormal">?secondary</item>
<item name="colorAccent">@color/base_accent_night</item>

View file

@ -78,6 +78,8 @@
<item name="android:textViewStyle">@style/MwmWidget.TextView</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:fontFamily" tools:targetApi="jelly_bean">@string/robotoRegular</item>
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
</style>
<style name="MwmTheme.DialogFragment.Fullscreen.Night" parent="Theme.AppCompat">
@ -91,6 +93,8 @@
<item name="android:textViewStyle">@style/MwmWidget.TextView</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:fontFamily" tools:targetApi="jelly_bean">@string/robotoRegular</item>
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
</style>
<style name="MwmTheme.DialogFragment.Fullscreen.Translucent">
@ -169,9 +173,6 @@
<item name="android:colorPrimaryDark" tools:targetApi="lollipop">@android:color/black</item>
<item name="android:timePickerStyle" tools:targetApi="lollipop">@style/MwmWidget.Editor.TimePicker</item>
<item name="android:windowBackground">@null</item>
<item name="windowActionBar">false</item>
<item name="windowActionBarOverlay">true</item>
<item name="android:windowActionBarOverlay">true</item>
</style>
<style name="MwmTheme.Night.FullScreenGalleryActivity">

View file

@ -140,6 +140,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
private boolean mIsFragmentContainer;
private boolean mIsFullscreen;
private boolean mIsFullscreenAnimating;
private boolean mIsAppearMenuLater;
private FloatingSearchToolbarController mSearchController;
@ -450,6 +451,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
mPositionChooser = findViewById(R.id.position_chooser);
final Toolbar toolbar = (Toolbar) mPositionChooser.findViewById(R.id.toolbar_position_chooser);
UiUtils.extendViewWithStatusBar(toolbar);
UiUtils.showHomeUpButton(toolbar);
toolbar.setNavigationOnClickListener(new OnClickListener()
{
@ -892,7 +894,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
private void adjustZoomButtons()
{
UiUtils.showIf(showZoomButtons(), mNavZoomIn, mNavZoomOut);
UiUtils.showIf(showZoomButtons() && !mIsFullscreen, mNavZoomIn, mNavZoomOut);
// TODO animate zoom buttons & myposition
}
@ -944,7 +946,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
if (!closePlacePage() && !closeSidePanel() &&
!RoutingController.get().cancel() && !closePositionChooser())
(mNavigationController != null && !mNavigationController.cancel()) && !closePositionChooser())
{
try
{
@ -1026,11 +1028,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
request.setPointData(object.getLat(), object.getLon(), object.getTitle(), object.getApiId());
object.setSubtitle(request.getCallerName(MwmApplication.get()).toString());
}
else if (MapObject.isOfType(MapObject.MY_POSITION, object) &&
RoutingController.get().isNavigating())
{
return;
}
setFullscreen(false);
@ -1091,6 +1088,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
adjustRuler(0, menuHeight);
mIsFullscreenAnimating = false;
if (mIsAppearMenuLater)
{
appearMenu(menu);
mIsAppearMenuLater = false;
}
}
});
if (showZoomButtons())
@ -1101,20 +1103,28 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
else
{
Animations.appearSliding(menu.getFrame(), Animations.BOTTOM, new Runnable()
if (!mIsFullscreenAnimating)
appearMenu(menu);
else
mIsAppearMenuLater = true;
}
}
private void appearMenu(BaseMenu menu)
{
Animations.appearSliding(menu.getFrame(), Animations.BOTTOM, new Runnable()
{
@Override
public void run()
{
@Override
public void run()
{
adjustCompass(0, 0);
adjustRuler(0, 0);
}
});
if (showZoomButtons())
{
Animations.appearSliding(mNavZoomOut, Animations.RIGHT, null);
Animations.appearSliding(mNavZoomIn, Animations.RIGHT, null);
adjustCompass(0, 0);
adjustRuler(0, 0);
}
});
if (showZoomButtons())
{
Animations.appearSliding(mNavZoomOut, Animations.RIGHT, null);
Animations.appearSliding(mNavZoomIn, Animations.RIGHT, null);
}
}
@ -1324,7 +1334,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
{
mNavigationController.show(true);
mSearchController.hide();
mMainMenu.setState(MainMenu.State.NAVIGATION, false);
mMainMenu.setState(MainMenu.State.NAVIGATION, false, mIsFullscreen);
return;
}
@ -1335,11 +1345,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
}
else if (RoutingController.get().isPlanning())
{
mMainMenu.setState(MainMenu.State.ROUTE_PREPARE, false);
mMainMenu.setState(MainMenu.State.ROUTE_PREPARE, false, mIsFullscreen);
return;
}
mMainMenu.setState(MainMenu.State.MENU, false);
mMainMenu.setState(MainMenu.State.MENU, false, mIsFullscreen);
}
private void adjustMenuLineFrameVisibility()

View file

@ -24,6 +24,7 @@ public class BaseMwmExtraTitleActivity extends BaseMwmFragmentActivity
title = bundle.getString(EXTRA_TITLE);
}
Toolbar toolbar = getToolbar();
UiUtils.extendViewWithStatusBar(toolbar);
toolbar.setTitle(title);
UiUtils.showHomeUpButton(toolbar);
displayToolbarAsActionBar();

View file

@ -3,6 +3,7 @@ package com.mapswithme.maps.base;
import android.app.Activity;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@ -11,10 +12,12 @@ import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.WindowManager;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
import com.mapswithme.util.ThemeUtils;
import com.mapswithme.util.UiUtils;
import com.mapswithme.util.Utils;
public class BaseMwmFragmentActivity extends AppCompatActivity
@ -50,6 +53,7 @@ public class BaseMwmFragmentActivity extends AppCompatActivity
mBaseDelegate.onCreate();
super.onCreate(savedInstanceState);
UiUtils.setupStatusBar(this);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
final int layoutId = getContentLayoutResId();
if (layoutId != 0)

View file

@ -4,6 +4,7 @@ import android.os.Bundle;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v7.widget.Toolbar;
import com.mapswithme.maps.R;
import com.mapswithme.util.UiUtils;
@ -15,6 +16,7 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity
super.onCreate(state);
Toolbar toolbar = getToolbar();
UiUtils.extendViewWithStatusBar(toolbar);
int title = getToolbarTitle();
if (title == 0)
toolbar.setTitle(getTitle());

View file

@ -3,7 +3,6 @@ package com.mapswithme.maps.gallery;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.StyleRes;
@ -66,8 +65,6 @@ public class FullScreenGalleryActivity extends BaseMwmFragmentActivity
toolbar.setTitle("");
UiUtils.showHomeUpButton(toolbar);
displayToolbarAsActionBar();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
mUserBlock = findViewById(R.id.rl__user_block);
mDescription = (TextView) findViewById(R.id.tv__description);

View file

@ -20,6 +20,7 @@ public class GPSCheck extends BroadcastReceiver
&& MwmApplication.get().isFrameworkInitialized() && MwmApplication.backgroundTracker().isForeground())
{
LocationHelper.INSTANCE.addLocationListener();
LocationHelper.INSTANCE.forceRestart();
}
}
}

View file

@ -606,6 +606,17 @@ public enum LocationHelper
}
}
public void forceRestart()
{
mActive = !mListeners.isEmpty();
if (mActive)
{
calcParams();
stopInternal();
startInternal();
}
}
/**
* Actually starts location polling.
*/

View file

@ -1,16 +1,262 @@
package com.mapswithme.maps.location;
import android.annotation.SuppressLint;
import android.net.SSLCertificateSocketFactory;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
interface PlatformSocket
import com.mapswithme.maps.BuildConfig;
import com.mapswithme.util.log.DebugLogger;
import com.mapswithme.util.log.Logger;
import javax.net.SocketFactory;
import javax.net.ssl.SSLSocketFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
/**
* Implements interface that will be used by the core for
* sending/receiving the raw data trough platform socket interface.
* <p>
* The instance of this class is supposed to be created in JNI layer
* and supposed to be used in the thread safe environment, i.e. thread safety
* should be provided externally (by the client of this class).
* <p>
* <b>All public methods are blocking and shouldn't be called from the main thread.</b>
*/
class PlatformSocket
{
boolean open(@NonNull String host, int port);
private final static Logger sLogger = new DebugLogger(PlatformSocket.class.getSimpleName());
private final static int DEFAULT_TIMEOUT = 30 * 1000;
@Nullable
private Socket mSocket;
@Nullable
private String mHost;
private int mPort;
private int mTimeout = DEFAULT_TIMEOUT;
void close();
public boolean open(@NonNull String host, int port)
{
if (mSocket != null)
{
sLogger.e("Socket is already opened. Seems that it wasn't closed.");
return false;
}
void setTimeout(int millis);
if (!isPortAllowed(port))
{
sLogger.e("A wrong port number, it must be within (0-65535) range", port);
return false;
}
boolean read(@NonNull byte[] data, int count);
mHost = host;
mPort = port;
boolean write(@NonNull byte[] data, int count);
Socket socket = createSocket(host, port, true);
if (socket != null && socket.isConnected())
{
setReadSocketTimeout(socket, mTimeout);
mSocket = socket;
}
return mSocket != null;
}
private static boolean isPortAllowed(int port)
{
return port >= 0 && port <= 65535;
}
@Nullable
private static Socket createSocket(@NonNull String host, int port, boolean ssl)
{
if (ssl)
{
try
{
SocketFactory sf = getSocketFactory();
return sf.createSocket(host, port);
} catch (IOException e)
{
sLogger.e("Failed to create the ssl socket, mHost = ", host, " mPort = ", port, e);
}
} else
{
try
{
return new Socket(host, port);
} catch (IOException e)
{
sLogger.e("Failed to create the socket, mHost = ", host, " mPort = ", port, e);
}
}
return null;
}
@SuppressLint("SSLCertificateSocketFactoryGetInsecure")
@NonNull
private static SocketFactory getSocketFactory()
{
// Trusting to any ssl certificate factory that will be used in
// debug mode, for testing purposes only.
if (BuildConfig.DEBUG)
//TODO: implement the custom KeyStore to make the self-signed certificates work
return SSLCertificateSocketFactory.getInsecure(0, null);
return SSLSocketFactory.getDefault();
}
public void close()
{
if (mSocket == null)
{
sLogger.d("Socket is already closed or it wasn't opened yet");
return;
}
try
{
mSocket.close();
sLogger.d("Socket has been closed: ", this);
} catch (IOException e)
{
sLogger.e("Failed to close socket: ", this, e);
} finally
{
mSocket = null;
}
}
public boolean read(@NonNull byte[] data, int count)
{
if (!checkSocketAndArguments(data, count))
return false;
sLogger.d("Reading has started, data.length = " + data.length, ", count = " + count);
long startTime = System.nanoTime();
int readBytes = 0;
try
{
if (mSocket == null)
throw new AssertionError("mSocket cannot be null");
InputStream in = mSocket.getInputStream();
while (readBytes != count && (System.nanoTime() - startTime) < mTimeout)
{
try
{
sLogger.d("Attempting to read ", count, " bytes from offset = ", readBytes);
int read = in.read(data, readBytes, count - readBytes);
if (read == -1)
{
sLogger.d("All data have been read from the stream, read bytes count = ", readBytes);
break;
}
if (read == 0)
{
sLogger.e("0 bytes have been obtained. It's considered as error");
break;
}
sLogger.d("Read bytes count = ", read);
readBytes += read;
} catch (SocketTimeoutException e)
{
long readingTime = System.nanoTime() - startTime;
sLogger.e(e, "Socked timeout has occurred after ", readingTime, " (ms) ");
if (readingTime > mTimeout)
{
sLogger.e("Socket wrapper timeout has occurred, requested count = ",
count - readBytes, ", " + "readBytes = ", readBytes);
break;
}
}
}
} catch (IOException e)
{
sLogger.e(e, "Failed to read data from socket: ", this);
}
return count == readBytes;
}
public boolean write(@NonNull byte[] data, int count)
{
if (!checkSocketAndArguments(data, count))
return false;
sLogger.d("Writing method has started, data.length = " + data.length, ", count = " + count);
long startTime = System.nanoTime();
try
{
if (mSocket == null)
throw new AssertionError("mSocket cannot be null");
OutputStream out = mSocket.getOutputStream();
out.write(data, 0, count);
sLogger.d(count + " bytes have been written");
return true;
} catch (SocketTimeoutException e)
{
long writingTime = System.nanoTime() - startTime;
sLogger.e(e, "Socked timeout has occurred after ", writingTime, " (ms) ");
} catch (IOException e)
{
sLogger.e(e, "Failed to write data to socket: ", this);
}
return false;
}
private boolean checkSocketAndArguments(@NonNull byte[] data, int count)
{
if (mSocket == null)
{
sLogger.e("Socket must be opened before reading/writing");
return false;
}
if (data.length < 0 || count < 0 || count > data.length)
{
sLogger.e("Illegal arguments, data.length = ", data.length, ", count = " + count);
return false;
}
return true;
}
public void setTimeout(int millis)
{
mTimeout = millis;
sLogger.d("Setting the socket wrapper timeout = ", millis, " ms");
}
private void setReadSocketTimeout(@NonNull Socket socket, int millis)
{
try
{
socket.setSoTimeout(millis);
} catch (SocketException e)
{
sLogger.e("Failed to set system socket timeout: ", millis, "ms, ", this, e);
}
}
@Override
public String toString()
{
return "PlatformSocket{" +
"mSocket=" + mSocket +
", mHost='" + mHost + '\'' +
", mPort=" + mPort +
'}';
}
}

View file

@ -1,265 +0,0 @@
package com.mapswithme.maps.location;
import android.annotation.SuppressLint;
import android.net.SSLCertificateSocketFactory;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.mapswithme.maps.BuildConfig;
import com.mapswithme.util.log.DebugLogger;
import com.mapswithme.util.log.Logger;
import javax.net.SocketFactory;
import javax.net.ssl.SSLSocketFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
/**
* Implements {@link PlatformSocket} interface that will be used by the core for
* sending/receiving the raw data trough platform socket interface.
* <p>
* The instance of this class is supposed to be created in JNI layer
* and supposed to be used in the thread safe environment, i.e. thread safety
* should be provided externally (by the client of this class).
* <p>
* <b>All public methods are blocking and shouldn't be called from the main thread.</b>
*/
class SocketWrapper implements PlatformSocket
{
private final static Logger sLogger = new DebugLogger(SocketWrapper.class.getSimpleName());
private final static int DEFAULT_TIMEOUT = 30 * 1000;
@Nullable
private Socket mSocket;
@Nullable
private String mHost;
private int mPort;
private int mTimeout = DEFAULT_TIMEOUT;
@Override
public boolean open(@NonNull String host, int port)
{
if (mSocket != null)
{
sLogger.e("Socket is already opened. Seems that it wasn't closed.");
return false;
}
if (!isPortAllowed(port))
{
sLogger.e("A wrong port number, it must be within (0-65535) range", port);
return false;
}
mHost = host;
mPort = port;
Socket socket = createSocket(host, port, true);
if (socket != null && socket.isConnected())
{
setReadSocketTimeout(socket, mTimeout);
mSocket = socket;
}
return mSocket != null;
}
private static boolean isPortAllowed(int port)
{
return port >= 0 && port <= 65535;
}
@Nullable
private static Socket createSocket(@NonNull String host, int port, boolean ssl)
{
if (ssl)
{
try
{
SocketFactory sf = getSocketFactory();
return sf.createSocket(host, port);
} catch (IOException e)
{
sLogger.e("Failed to create the ssl socket, mHost = ", host, " mPort = ", port, e);
}
} else
{
try
{
return new Socket(host, port);
} catch (IOException e)
{
sLogger.e("Failed to create the socket, mHost = ", host, " mPort = ", port, e);
}
}
return null;
}
@SuppressLint("SSLCertificateSocketFactoryGetInsecure")
@NonNull
private static SocketFactory getSocketFactory()
{
// Trusting to any ssl certificate factory that will be used in
// debug mode, for testing purposes only.
if (BuildConfig.DEBUG)
//TODO: implement the custom KeyStore to make the self-signed certificates work
return SSLCertificateSocketFactory.getInsecure(0, null);
return SSLSocketFactory.getDefault();
}
@Override
public void close()
{
if (mSocket == null)
{
sLogger.d("Socket is already closed or it wasn't opened yet");
return;
}
try
{
mSocket.close();
} catch (IOException e)
{
sLogger.e("Failed to close socket: ", this, e);
} finally
{
mSocket = null;
}
}
@Override
public boolean read(@NonNull byte[] data, int count)
{
if (!checkSocketAndArguments(data, count))
return false;
sLogger.d("Reading has started, data.length = " + data.length, ", count = " + count);
long startTime = System.nanoTime();
int readBytes = 0;
try
{
if (mSocket == null)
throw new AssertionError("mSocket cannot be null");
InputStream in = mSocket.getInputStream();
while (readBytes != count && (System.nanoTime() - startTime) < mTimeout)
{
try
{
sLogger.d("Attempting to read ", count, " bytes from offset = ", readBytes);
int read = in.read(data, readBytes, count - readBytes);
if (read == -1)
{
sLogger.d("All data have been read from the stream, read bytes count = ", readBytes);
break;
}
if (read == 0)
{
sLogger.e("0 bytes have been obtained. It's considered as error");
break;
}
sLogger.d("Read bytes count = ", read);
readBytes += read;
} catch (SocketTimeoutException e)
{
long readingTime = System.nanoTime() - startTime;
sLogger.e(e, "Socked timeout has occurred after ", readingTime, " (ms) ");
if (readingTime > mTimeout)
{
sLogger.e("Socket wrapper timeout has occurred, requested count = ",
count - readBytes, ", " + "readBytes = ", readBytes);
break;
}
}
}
} catch (IOException e)
{
sLogger.e(e, "Failed to read data from socket: ", this);
}
return count == readBytes;
}
@Override
public boolean write(@NonNull byte[] data, int count)
{
if (!checkSocketAndArguments(data, count))
return false;
sLogger.d("Writing method has started, data.length = " + data.length, ", count = " + count);
long startTime = System.nanoTime();
try
{
if (mSocket == null)
throw new AssertionError("mSocket cannot be null");
OutputStream out = mSocket.getOutputStream();
out.write(data, 0, count);
return true;
} catch (SocketTimeoutException e)
{
long writingTime = System.nanoTime() - startTime;
sLogger.e(e, "Socked timeout has occurred after ", writingTime, " (ms) ");
} catch (IOException e)
{
sLogger.e(e, "Failed to write data to socket: ", this);
}
return false;
}
private boolean checkSocketAndArguments(@NonNull byte[] data, int count)
{
if (mSocket == null)
{
sLogger.e("Socket must be opened before reading/writing");
return false;
}
if (data.length < 0 || count < 0 || count > data.length)
{
sLogger.e("Illegal arguments, data.length = ", data.length, ", count = " + count);
return false;
}
return true;
}
@Override
public void setTimeout(int millis)
{
mTimeout = millis;
sLogger.d("Setting the socket wrapper timeout = ", millis, " ms");
}
private void setReadSocketTimeout(@NonNull Socket socket, int millis)
{
try
{
socket.setSoTimeout(millis);
} catch (SocketException e)
{
sLogger.e("Failed to set system socket timeout: ", millis, "ms, ", this, e);
}
}
@Override
public String toString()
{
return "SocketWrapper{" +
"mSocket=" + mSocket +
", mHost='" + mHost + '\'' +
", mPort=" + mPort +
'}';
}
}

View file

@ -98,6 +98,9 @@ public class NavigationController
View shadow = topFrame.findViewById(R.id.shadow_top);
UiUtils.showIf(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP, shadow);
UiUtils.extendViewWithStatusBar(mStreetFrame);
UiUtils.extendViewMarginWithStatusBar(turnFrame);
// Bottom frame
mSpeedValue = (TextView) mBottomFrame.findViewById(R.id.speed_value);
mSpeedUnits = (TextView) mBottomFrame.findViewById(R.id.speed_dimen);
@ -133,10 +136,7 @@ public class NavigationController
{
case STOP:
RoutingController.get().cancel();
Statistics.INSTANCE.trackEvent(Statistics.EventName.ROUTING_CLOSE);
AlohaHelper.logClick(AlohaHelper.ROUTING_CLOSE);
parent.refreshFade();
mSearchWheel.reset();
stop(parent);
break;
case SETTINGS:
parent.closeMenu(Statistics.EventName.ROUTING_SETTINGS, AlohaHelper.MENU_SETTINGS, new Runnable()
@ -162,6 +162,14 @@ public class NavigationController
});
}
private void stop(MwmActivity parent)
{
Statistics.INSTANCE.trackEvent(Statistics.EventName.ROUTING_CLOSE);
AlohaHelper.logClick(AlohaHelper.ROUTING_CLOSE);
parent.refreshFade();
mSearchWheel.reset();
}
private void updateVehicle(RoutingInfo info)
{
mNextTurnDistance.setText(Utils.formatUnitsText(mFrame.getContext(),
@ -282,8 +290,6 @@ public class NavigationController
UiUtils.showIf(show, mFrame);
UiUtils.showIf(show, mSearchButtonFrame);
mNavMenu.show(show);
if (!show)
mSearchWheel.reset();
}
public NavMenu getNavMenu()
@ -301,4 +307,14 @@ public class NavigationController
mShowTimeLeft = savedInstanceState.getBoolean(STATE_SHOW_TIME_LEFT);
}
public boolean cancel()
{
if (RoutingController.get().cancel())
{
final MwmActivity parent = ((MwmActivity) mFrame.getContext());
stop(parent);
return true;
}
return false;
}
}

View file

@ -18,12 +18,12 @@ import android.widget.TextView;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
import com.mapswithme.maps.uber.Uber;
import com.mapswithme.maps.uber.UberInfo;
import com.mapswithme.maps.uber.UberLinks;
import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.maps.downloader.MapManager;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.uber.Uber;
import com.mapswithme.maps.uber.UberInfo;
import com.mapswithme.maps.uber.UberLinks;
import com.mapswithme.util.Config;
import com.mapswithme.util.ConnectionState;
import com.mapswithme.util.StringUtils;
@ -270,7 +270,7 @@ public class RoutingController
mLastBuildProgress = 0;
mInternetConnected = ConnectionState.isConnected();
if (mLastRouterType == Framework.ROUTER_TYPE_TAXI)
if (isTaxiRouterType())
{
if (!mInternetConnected)
{
@ -509,7 +509,17 @@ public class RoutingController
boolean isUberPlanning()
{
return mLastRouterType == Framework.ROUTER_TYPE_TAXI && mUberPlanning;
return isTaxiRouterType() && mUberPlanning;
}
boolean isTaxiRouterType()
{
return mLastRouterType == Framework.ROUTER_TYPE_TAXI;
}
boolean isVehicleRouterType()
{
return mLastRouterType == Framework.ROUTER_TYPE_VEHICLE;
}
public boolean isNavigating()
@ -724,7 +734,7 @@ public class RoutingController
// Repeating tap on Uber icon should trigger the route building always,
// because it may be "No internet connection, try later" case
if (router == mLastRouterType && router != Framework.ROUTER_TYPE_TAXI)
if (router == mLastRouterType && !isTaxiRouterType())
return;
mLastRouterType = router;
@ -814,7 +824,8 @@ public class RoutingController
private void requestUberInfo()
{
mUberPlanning = true;
Uber.nativeRequestUberProducts(mStartPoint.getLat(), mStartPoint.getLon(), mEndPoint.getLat(), mEndPoint.getLon());
Uber.nativeRequestUberProducts(mStartPoint.getLat(), mStartPoint.getLon(),
mEndPoint.getLat(), mEndPoint.getLon());
if (mContainer != null)
mContainer.updateBuildProgress(0, mLastRouterType);
}
@ -822,7 +833,8 @@ public class RoutingController
@NonNull
UberLinks getUberLink(@NonNull String productId)
{
return Uber.nativeGetUberLinks(productId, mStartPoint.getLat(), mStartPoint.getLon(), mEndPoint.getLat(), mEndPoint.getLon());
return Uber.nativeGetUberLinks(productId, mStartPoint.getLat(), mStartPoint.getLon(),
mEndPoint.getLat(), mEndPoint.getLon());
}
/**
@ -834,7 +846,7 @@ public class RoutingController
{
mUberPlanning = false;
mLogger.d("onUberInfoReceived uberInfo = " + info);
if (mLastRouterType == Framework.ROUTER_TYPE_TAXI && mContainer != null)
if (isTaxiRouterType() && mContainer != null)
{
mContainer.onUberInfoReceived(info);
completeUberRequest();
@ -851,7 +863,7 @@ public class RoutingController
mUberPlanning = false;
Uber.ErrorCode code = Uber.ErrorCode.valueOf(errorCode);
mLogger.e("onUberError error = " + code);
if (mLastRouterType == Framework.ROUTER_TYPE_TAXI && mContainer != null)
if (isTaxiRouterType() && mContainer != null)
{
mContainer.onUberError(code);
completeUberRequest();

View file

@ -211,14 +211,14 @@ public class RoutingPlanController extends ToolbarController
return;
}
if (!isTaxiRouteChecked())
if (!isTaxiRouterType())
setStartButton();
showAltitudeChartAndRoutingDetails();
}
private void showAltitudeChartAndRoutingDetails()
{
if (isTaxiRouteChecked())
if (isTaxiRouterType())
return;
UiUtils.hide(getViewById(R.id.error));
@ -365,14 +365,14 @@ public class RoutingPlanController extends ToolbarController
}
}
private boolean isVehicleRouteChecked()
private boolean isVehicleRouterType()
{
return mRouterTypes.getCheckedRadioButtonId() == R.id.vehicle;
return RoutingController.get().isVehicleRouterType();
}
private boolean isTaxiRouteChecked()
private boolean isTaxiRouterType()
{
return mRouterTypes.getCheckedRadioButtonId() == R.id.taxi;
return RoutingController.get().isTaxiRouterType();
}
void disableToggle()
@ -394,7 +394,7 @@ public class RoutingPlanController extends ToolbarController
void showRouteAltitudeChartInternal(@NonNull ImageView altitudeChart)
{
if (isVehicleRouteChecked())
if (isVehicleRouterType())
{
UiUtils.hide(altitudeChart);
return;
@ -442,7 +442,7 @@ public class RoutingPlanController extends ToolbarController
showError(R.string.taxi_not_found);
break;
case RemoteError:
showError(R.string.uber_remote_error);
showError(R.string.dialog_taxi_error);
break;
default:
throw new AssertionError("Unsupported uber error: " + code);
@ -455,7 +455,7 @@ public class RoutingPlanController extends ToolbarController
int checkedId = mRouterTypes.getCheckedRadioButtonId();
RoutingToolbarButton rb = (RoutingToolbarButton) mRouterTypes.findViewById(checkedId);
rb.error();
showError(R.string.uber_no_internet);
showError(R.string.dialog_taxi_offline);
}
private void showError(@StringRes int message)
@ -496,7 +496,7 @@ public class RoutingPlanController extends ToolbarController
{
Button start = (Button) getViewById(R.id.start);
if (isTaxiRouteChecked())
if (isTaxiRouterType())
{
final boolean isUberInstalled = Utils.isUberInstalled(mActivity);
start.setText(isUberInstalled ? R.string.taxi_order : R.string.install_app);

View file

@ -1,6 +1,5 @@
package com.mapswithme.maps.routing;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.widget.ImageView;
@ -8,7 +7,6 @@ import android.widget.ImageView;
import com.mapswithme.maps.MwmActivity;
import com.mapswithme.maps.R;
import com.mapswithme.maps.bookmarks.data.MapObject;
import com.mapswithme.util.ThemeUtils;
import com.mapswithme.util.UiUtils;
public class RoutingPlanInplaceController extends RoutingPlanController
@ -17,17 +15,9 @@ public class RoutingPlanInplaceController extends RoutingPlanController
private Boolean mSlotsRestoredState;
private void updateStatusBarColor()
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
mActivity.getWindow().setStatusBarColor(ThemeUtils.getColor(mActivity, UiUtils.isVisible(mFrame) ? R.attr.statusBar
: android.R.attr.colorPrimaryDark));
}
public RoutingPlanInplaceController(MwmActivity activity)
{
super(activity.findViewById(R.id.routing_plan_frame), activity);
updateStatusBarColor();
}
public void show(boolean show)
@ -47,7 +37,6 @@ public class RoutingPlanInplaceController extends RoutingPlanController
}
UiUtils.showIf(show, mFrame);
updateStatusBarColor();
if (show)
updatePoints();
}

View file

@ -36,6 +36,10 @@ class SearchWheel implements View.OnClickListener
@Override
public void run()
{
// if the search bar is already closed, i.e. nothing should be done here.
if (!mIsExpanded)
return;
toggleSearchLayout();
}
};
@ -237,7 +241,6 @@ class SearchWheel implements View.OnClickListener
parent.showSearch();
mIsExpanded = false;
refreshSearchVisibility();
UiThread.cancelDelayedTasks(mCloseRunnable);
}
private void startSearch(SearchOption searchOption)

View file

@ -130,12 +130,14 @@ public class SettingsActivity extends PreferenceActivity
getAppDelegate().onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
UiUtils.setupStatusBar(this);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
// Hack to attach Toolbar and make it work on native PreferenceActivity
ViewGroup root = (ViewGroup)findViewById(android.R.id.list).getParent().getParent().getParent();
View toolbarHolder = LayoutInflater.from(this).inflate(R.layout.toolbar_default, root, false);
Toolbar toolbar = (Toolbar) toolbarHolder.findViewById(R.id.toolbar);
UiUtils.extendViewWithStatusBar(toolbar);
UiUtils.showHomeUpButton(toolbar);
// First, add toolbar view to UI.

View file

@ -27,6 +27,8 @@ public class ToolbarController
{
mActivity = activity;
mToolbar = (Toolbar) root.findViewById(getToolbarId());
UiUtils.extendViewWithStatusBar(mToolbar);
setupNavigationListener();
}

View file

@ -222,7 +222,7 @@ public class MainMenu extends BaseMenu
mapItem(Item.SETTINGS);
adjustCollapsedItems();
setState(State.MENU, false);
setState(State.MENU, false, false);
}
public MainMenu(View frame, ItemClickListener<Item> itemClickListener)
@ -250,7 +250,7 @@ public class MainMenu extends BaseMenu
return R.dimen.menu_line_height;
}
public void setState(State state, boolean animateToggle)
public void setState(State state, boolean animateToggle, boolean isFullScreen)
{
if (state != State.NAVIGATION)
{
@ -281,7 +281,7 @@ public class MainMenu extends BaseMenu
if (mLayoutMeasured)
{
show(state != State.NAVIGATION);
show(state != State.NAVIGATION && !isFullScreen);
mContentFrame.measure(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
mContentHeight = mContentFrame.getMeasuredHeight();

View file

@ -40,6 +40,7 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
BottomPlacePageAnimationController(@NonNull PlacePageView placePage)
{
super(placePage);
UiUtils.extendViewMarginWithStatusBar(mDetailsScroll);
mLayoutToolbar = (LinearLayout) mPlacePage.findViewById(R.id.toolbar_layout);
if (mLayoutToolbar == null)
return;
@ -47,6 +48,7 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
final Toolbar toolbar = (Toolbar) mLayoutToolbar.findViewById(R.id.toolbar);
if (toolbar != null)
{
UiUtils.extendViewWithStatusBar(toolbar);
UiUtils.showHomeUpButton(toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener()
{
@ -90,6 +92,10 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
return true;
break;
case MotionEvent.ACTION_UP:
if (mIsGestureStartedInsideView)
mGestureDetector.onTouchEvent(event);
break;
}
return false;
@ -168,15 +174,14 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
mIsDragging = true;
if (!translateBy(-distanceY))
{
if (mDetailsScroll.getTranslationY() == 0)
boolean scrollable = isDetailContentScrollable();
int maxTranslationY = mDetailsScroll.getHeight() - mDetailsContent.getHeight();
if ((scrollable && mDetailsScroll.getTranslationY() == 0)
|| (!scrollable && mDetailsScroll.getTranslationY() <= maxTranslationY))
{
mDetailsScroll.scrollBy((int) distanceX, (int) distanceY);
mState = State.FULLSCREEN;
}
else
{
mPlacePage.setState(State.HIDDEN);
}
}
}
@ -328,7 +333,17 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
hidePlacePage();
break;
case PREVIEW:
showPreview(currentState);
mPreview.addOnLayoutChangeListener(new View.OnLayoutChangeListener()
{
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom)
{
mPreview.removeOnLayoutChangeListener(this);
showPreview(currentState);
}
});
mPreview.requestLayout();
break;
case DETAILS:
showDetails();

View file

@ -85,6 +85,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
private void initToolbar(View view)
{
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
UiUtils.extendViewWithStatusBar(toolbar);
final TextView textView = (TextView) toolbar.findViewById(R.id.tv__save);
textView.setOnClickListener(new View.OnClickListener()
{

View file

@ -79,6 +79,7 @@ public class EditDescriptionFragment extends BaseMwmDialogFragment
private void initToolbar(View view)
{
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
UiUtils.extendViewWithStatusBar(toolbar);
final TextView textView = (TextView) toolbar.findViewById(R.id.tv__save);
textView.setOnClickListener(new View.OnClickListener()
{

View file

@ -16,6 +16,7 @@ class LeftPlacePageAnimationController extends BasePlacePageAnimationController
LeftPlacePageAnimationController(@NonNull PlacePageView placePage)
{
super(placePage);
UiUtils.extendViewPaddingWithStatusBar(mPreview);
}
@Override

View file

@ -28,6 +28,7 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
@ -138,7 +139,8 @@ public class PlacePageView extends RelativeLayout
private View mAddPlace;
// Bookmark
private View mBookmarkFrame;
private TextView mBookmarkNote;
private WebView mWvBookmarkNote;
private TextView mTvBookmarkNote;
private boolean mBookmarkSet;
// Place page buttons
private PlacePageButtons mButtons;
@ -312,7 +314,9 @@ public class PlacePageView extends RelativeLayout
mWiki.setOnLongClickListener(this);
mBookmarkFrame = mDetails.findViewById(R.id.bookmark_frame);
mBookmarkNote = (TextView) mBookmarkFrame.findViewById(R.id.tv__bookmark_notes);
mWvBookmarkNote = (WebView) mBookmarkFrame.findViewById(R.id.wv__bookmark_notes);
mWvBookmarkNote.getSettings().setJavaScriptEnabled(false);
mTvBookmarkNote = (TextView) mBookmarkFrame.findViewById(R.id.tv__bookmark_notes);
mBookmarkFrame.findViewById(R.id.tv__bookmark_edit).setOnClickListener(this);
ViewGroup ppButtons = (ViewGroup) findViewById(R.id.pp__buttons);
@ -348,7 +352,7 @@ public class PlacePageView extends RelativeLayout
case BOOKMARK:
mBookmarkButtonIcon = icon;
updateButtons();
updateBookmarkButton();
color = ThemeUtils.getColor(getContext(), R.attr.iconTint);
break;
@ -755,6 +759,12 @@ public class PlacePageView extends RelativeLayout
{
mDetails.scrollTo(0, 0);
// If place page is closed the state of webview should be cleared,
// otherwise the animation controller will work with stale webview height,
// since the webview caches its state completely, and animation will work wrong.
if (state == State.HIDDEN)
clearBookmarkWebView();
if (mMapObject != null)
mAnimationController.setState(state, mMapObject.getMapObjectType());
@ -771,6 +781,11 @@ public class PlacePageView extends RelativeLayout
}
}
private void clearBookmarkWebView()
{
mWvBookmarkNote.loadUrl("about:blank");
}
public MapObject getMapObject()
{
return mMapObject;
@ -827,6 +842,7 @@ public class PlacePageView extends RelativeLayout
case MapObject.BOOKMARK:
refreshDistanceToObject(loc);
showBookmarkDetails();
updateBookmarkButton();
setButtons(false, true);
break;
case MapObject.POI:
@ -918,8 +934,7 @@ public class PlacePageView extends RelativeLayout
{
UiUtils.hide(mWebsite);
// TODO: remove this after booking_api.cpp will be done
if (!USE_OLD_BOOKING)
UiUtils.hide(mHotelMore);
UiUtils.showIf(USE_OLD_BOOKING, mHotelMore);
if (mSponsored.getType() != Sponsored.TYPE_BOOKING)
UiUtils.hide(mHotelMore);
@ -993,7 +1008,7 @@ public class PlacePageView extends RelativeLayout
mTodayOpeningHours.setTextColor(color);
}
private void updateButtons()
private void updateBookmarkButton()
{
if (mBookmarkButtonIcon == null)
return;
@ -1008,16 +1023,35 @@ public class PlacePageView extends RelativeLayout
{
mBookmarkSet = false;
UiUtils.hide(mBookmarkFrame);
updateButtons();
updateBookmarkButton();
}
private void showBookmarkDetails()
{
mBookmarkSet = true;
UiUtils.show(mBookmarkFrame);
UiUtils.setTextAndHideIfEmpty(mBookmarkNote, ((Bookmark) mMapObject).getBookmarkDescription());
Linkify.addLinks(mBookmarkNote, Linkify.ALL);
updateButtons();
final String notes = ((Bookmark) mMapObject).getBookmarkDescription();
if (TextUtils.isEmpty(notes))
{
UiUtils.hide(mTvBookmarkNote, mWvBookmarkNote);
return;
}
if (StringUtils.nativeIsHtml(notes))
{
mWvBookmarkNote.loadData(notes, "text/html; charset=utf-8", null);
UiUtils.show(mWvBookmarkNote);
UiUtils.hide(mTvBookmarkNote);
}
else
{
mTvBookmarkNote.setText(notes);
Linkify.addLinks(mTvBookmarkNote, Linkify.ALL);
UiUtils.show(mTvBookmarkNote);
UiUtils.hide(mWvBookmarkNote);
}
}
private void setButtons(boolean showBackButton, boolean showRoutingButton)
@ -1082,11 +1116,15 @@ public class PlacePageView extends RelativeLayout
final StringBuilder builder = new StringBuilder();
if (l.hasAltitude())
builder.append(Framework.nativeFormatAltitude(l.getAltitude()));
{
double altitude = l.getAltitude();
builder.append(altitude >= 0 ? "" : "");
builder.append(Framework.nativeFormatAltitude(altitude));
}
if (l.hasSpeed())
builder.append(" ")
.append(Framework.nativeFormatSpeed(l.getSpeed()));
mTvSubtitle.setText(builder.toString());
UiUtils.setTextAndHideIfEmpty(mTvSubtitle, builder.toString());
mMapObject.setLat(l.getLatitude());
mMapObject.setLon(l.getLongitude());

View file

@ -7,6 +7,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Build;
@ -20,13 +21,17 @@ import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@ -35,6 +40,7 @@ import com.mapswithme.maps.R;
public final class UiUtils
{
private static final int DEFAULT_TINT_COLOR = Color.parseColor("#20000000");
private static float sScreenDensity;
public static class SimpleAnimationListener implements AnimationListener
@ -359,6 +365,81 @@ public final class UiUtils
return viewRect.contains(x, y);
}
private static int getStatusBarHeight(@NonNull Context context)
{
int result = 0;
Resources res = context.getResources();
int resourceId = res.getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
result = res.getDimensionPixelSize(resourceId);
return result;
}
public static void extendViewWithStatusBar(@NonNull View view)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
int statusBarHeight = getStatusBarHeight(view.getContext());
ViewGroup.LayoutParams lp = view.getLayoutParams();
lp.height += statusBarHeight;
view.setLayoutParams(lp);
extendViewPaddingTop(view, statusBarHeight);
}
public static void extendViewPaddingWithStatusBar(@NonNull View view)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
int statusBarHeight = getStatusBarHeight(view.getContext());
extendViewPaddingTop(view, statusBarHeight);
}
private static void extendViewPaddingTop(@NonNull View view, int statusBarHeight)
{
view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + statusBarHeight,
view.getPaddingRight(), view.getPaddingBottom());
}
public static void extendViewMarginWithStatusBar(@NonNull View view)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
int statusBarHeight = getStatusBarHeight(view.getContext());
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
int margin = lp.getMarginStart();
lp.setMargins(margin, margin + statusBarHeight, margin, margin);
view.setLayoutParams(lp);
}
public static void setupStatusBar(@NonNull Activity activity)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
activity.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
else
{
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
View statusBarTintView = new View(activity);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
params.gravity = Gravity.TOP;
statusBarTintView.setLayoutParams(params);
statusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
statusBarTintView.setVisibility(View.VISIBLE);
ViewGroup decorViewGroup = (ViewGroup) activity.getWindow().getDecorView();
decorViewGroup.addView(statusBarTintView);
}
// utility class
private UiUtils() {}
}

View file

@ -18,8 +18,10 @@ class MapObjectShareable extends BaseShareable
super(context);
final Activity activity = getActivity();
final String ge0Url = Framework.nativeGetGe0Url(mapObject.getLat(), mapObject.getLon(), mapObject.getScale(), mapObject.getTitle());
final String ge0Url = Framework.nativeGetGe0Url(mapObject.getLat(), mapObject.getLon(),
mapObject.getScale(), mapObject.getTitle());
final String httpUrl = Framework.getHttpGe0Url(mapObject.getLat(), mapObject.getLon(),
mapObject.getScale(), mapObject.getTitle());
final String subject;
String text;
if (MapObject.isOfType(MapObject.MY_POSITION, mapObject))
@ -27,8 +29,7 @@ class MapObjectShareable extends BaseShareable
subject = activity.getString(R.string.my_position_share_email_subject);
text = activity.getString(R.string.my_position_share_email,
Framework.nativeGetNameAndAddress(mapObject.getLat(), mapObject.getLon()),
ge0Url,
Framework.getHttpGe0Url(mapObject.getLat(), mapObject.getLon(), mapObject.getScale(), mapObject.getTitle()));
ge0Url, httpUrl);
}
else
{
@ -38,7 +39,8 @@ class MapObjectShareable extends BaseShareable
lineWithBreak(mapObject.getTitle()) +
lineWithBreak(mapObject.getSubtitle()) +
lineWithBreak(mapObject.getAddress()) +
lineWithBreak(ge0Url);
lineWithBreak(ge0Url) +
lineWithBreak(httpUrl);
if (sponsored != null)
{

View file

@ -230,6 +230,7 @@ public enum Statistics
Statistics()
{
mEnabled = Config.isStatisticsEnabled();
Config.setStatisticsEnabled(mEnabled);
final Context context = MwmApplication.get();
// At the moment we need special handling for Alohalytics to enable/disable logging of events in core C++ code.
if (mEnabled)

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
WorldCoasts.mwm 4638135
WorldCoasts.mwm 4638210
WorldCoasts_obsolete.mwm 4513802
World.mwm 35397811
World.mwm 35428985
01_dejavusans.ttf 633604
02_droidsans-fallback.ttf 4033420
03_jomolhari-id-a3d.ttf 1817160

View file

@ -8,10 +8,16 @@ uniform mat4 pivotTransform;
varying vec2 v_colorTexCoords;
const float kShapeCoordScalar = 1000.0;
void main(void)
{
vec4 pos = vec4(a_position.xyz, 1) * modelView;
vec4 norm = vec4(a_normal, 0, 0) * modelView;
float normalLen = length(a_normal);
vec4 n = normalize(vec4(a_position.xy + a_normal * kShapeCoordScalar, 0, 0) * modelView);
vec4 norm = n * normalLen;
vec4 shiftedPos = norm + pos;
shiftedPos = shiftedPos * projection;
float w = shiftedPos.w;

View file

@ -43,10 +43,6 @@ void PathSymbolShape::Draw(ref_ptr<dp::Batcher> batcher, ref_ptr<dp::TextureMana
glsl::vec2 const pivot = glsl::ToVec2(ConvertToLocal(splineIter.m_pos, m_params.m_tileCenter, kShapeCoordScalar));
glsl::vec2 n = halfH * glsl::normalize(glsl::vec2(-splineIter.m_dir.y, splineIter.m_dir.x));
glsl::vec2 d = halfW * glsl::normalize(glsl::vec2(splineIter.m_dir.x, splineIter.m_dir.y));
float nLength = glsl::length(n) * pToGScale;
float dLength = glsl::length(d) * pToGScale;
n = nLength * glsl::normalize(n);
d = dLength * glsl::normalize(d);
buffer.emplace_back(gpu::SolidTexturingVertex(glsl::vec4(pivot, m_params.m_depth, 0.0f), - d - n, glsl::ToVec2(rect.LeftTop())));
buffer.emplace_back(gpu::SolidTexturingVertex(glsl::vec4(pivot, m_params.m_depth, 0.0f), - d + n, glsl::ToVec2(rect.LeftBottom())));

View file

@ -79,30 +79,48 @@ void FilterRulesByRuntimeSelector(FeatureType const & f, int zoomLevel, drule::K
});
}
class KeyFunctor
class Aggregator
{
public:
KeyFunctor(FeatureType const & f,
feature::EGeomType type,
Aggregator(FeatureType const & f,
feature::EGeomType const type,
int const zoomLevel,
int const keyCount,
CaptionDescription & descr)
int const keyCount)
: m_pointStyleFound(false)
, m_lineStyleFound(false)
, m_iconFound(false)
, m_captionWithoutOffsetFound(false)
, m_auxCaptionFound(false)
, m_mainTextType(drule::text_type_name)
, m_descrInit(false)
, m_f(f)
, m_geomType(type)
, m_zoomLevel(zoomLevel)
, m_descr(descr)
{
m_rules.reserve(keyCount);
Init();
}
void AggregateKeys(drule::KeysT const & keys)
{
for (auto const & key : keys)
ProcessKey(key);
}
void AggregateStyleFlags(drule::KeysT const & keys, bool const nameExists)
{
for (auto const & key : keys)
{
bool const isNonEmptyCaption = IsTypeOf(key, Caption) && nameExists;
m_pointStyleFound |= (IsTypeOf(key, Symbol | Circle) || isNonEmptyCaption);
m_lineStyleFound |= IsTypeOf(key, Line);
}
}
bool m_pointStyleFound;
bool m_lineStyleFound;
bool m_auxCaptionFound;
drule::text_type_t m_mainTextType;
buffer_vector<Stylist::TRuleWrapper, 8> m_rules;
private:
void ProcessKey(drule::Key const & key)
{
double depth = key.m_priority;
@ -117,36 +135,23 @@ public:
if (IsTypeOf(key, Caption | Symbol | Circle | PathText))
{
depth += m_priorityModifier;
if (m_geomType == feature::GEOM_POINT) ++depth;
if (m_geomType == feature::GEOM_POINT)
++depth;
}
else if (IsTypeOf(key, Area))
depth -= m_priorityModifier;
drule::BaseRule const * const dRule = drule::rules().Find(key);
m_rules.push_back(make_pair(dRule, depth));
if (dRule->GetCaption(0) != nullptr)
{
InitCaptionDescription();
m_mainTextType = dRule->GetCaptionTextType(0);
depth -= m_priorityModifier;
}
bool const isNonEmptyCaption = IsTypeOf(key, Caption) && IsNameExists();
m_pointStyleFound |= (IsTypeOf(key, Symbol | Circle) || isNonEmptyCaption);
m_lineStyleFound |= IsTypeOf(key, Line);
drule::BaseRule const * const dRule = drule::rules().Find(key);
m_rules.emplace_back(make_pair(dRule, depth));
if (dRule->GetCaption(0) != nullptr)
m_mainTextType = dRule->GetCaptionTextType(0);
m_auxCaptionFound |= (dRule->GetCaption(1) != nullptr);
}
bool m_pointStyleFound;
bool m_lineStyleFound;
bool m_iconFound;
bool m_captionWithoutOffsetFound;
bool m_auxCaptionFound;
buffer_vector<Stylist::TRuleWrapper, 8> m_rules;
drule::text_type_t m_mainTextType;
bool m_descrInit;
private:
void Init()
{
m_depthLayer = m_f.GetLayer();
@ -162,28 +167,11 @@ private:
}
}
void InitCaptionDescription()
{
if (!m_descrInit)
{
m_descr.Init(m_f, m_zoomLevel);
m_descrInit = true;
}
}
inline bool IsNameExists() const
{
ASSERT(m_descrInit, ());
return m_descr.IsNameExists();
}
private:
FeatureType const & m_f;
feature::EGeomType m_geomType;
int const m_zoomLevel;
double m_priorityModifier;
int m_depthLayer;
CaptionDescription & m_descr;
};
const uint8_t CoastlineFlag = 1;
@ -196,41 +184,21 @@ const uint8_t PointStyleFlag = 1 << 3;
// ==================================== //
void CaptionDescription::Init(FeatureType const & f,
int const zoomLevel)
int const zoomLevel,
feature::EGeomType const type,
drule::text_type_t const mainTextType,
bool const auxCaptionExists)
{
f.GetPreferredNames(m_mainText, m_auxText);
if (auxCaptionExists || type == feature::GEOM_LINE)
f.GetPreferredNames(m_mainText, m_auxText);
else
f.GetReadableName(m_mainText);
m_roadNumber = f.GetRoadNumber();
m_houseNumber = f.GetHouseNumber();
SwapCaptions(zoomLevel);
DiscardLongCaption(zoomLevel);
}
void CaptionDescription::FormatCaptions(FeatureType const & f,
feature::EGeomType type,
drule::text_type_t mainTextType,
bool auxCaptionExists)
{
if (!auxCaptionExists && !m_auxText.empty() && type != feature::GEOM_LINE)
{
m_mainText.swap(m_auxText);
m_auxText.clear();
}
if (mainTextType == drule::text_type_housenumber)
{
m_mainText.swap(m_houseNumber);
m_houseNumber.clear();
}
else if (mainTextType == drule::text_type_name)
{
if (!m_houseNumber.empty())
{
if (m_mainText.empty() || m_houseNumber.find(m_mainText) != string::npos)
m_houseNumber.swap(m_mainText);
}
}
ProcessZoomLevel(zoomLevel);
ProcessMainTextType(mainTextType);
}
string const & CaptionDescription::GetMainText() const
@ -262,21 +230,34 @@ bool CaptionDescription::IsNameExists() const
return !m_mainText.empty() || !m_houseNumber.empty();
}
void CaptionDescription::SwapCaptions(int const zoomLevel)
void CaptionDescription::ProcessZoomLevel(int const zoomLevel)
{
if (zoomLevel <= scales::GetUpperWorldScale() && !m_auxText.empty())
{
m_mainText.swap(m_auxText);
m_auxText.clear();
}
}
void CaptionDescription::DiscardLongCaption(int const zoomLevel)
{
if (zoomLevel < 5 && m_mainText.size() > 50)
m_mainText.clear();
}
void CaptionDescription::ProcessMainTextType(drule::text_type_t const & mainTextType)
{
if (mainTextType == drule::text_type_housenumber)
{
m_mainText.swap(m_houseNumber);
m_houseNumber.clear();
}
else if (mainTextType == drule::text_type_name)
{
if (!m_houseNumber.empty())
{
if (m_mainText.empty() || m_houseNumber.find(m_mainText) != string::npos)
m_houseNumber.swap(m_mainText);
}
}
}
// ==================================== //
Stylist::Stylist()
@ -385,21 +366,20 @@ bool InitStylist(FeatureType const & f, int const zoomLevel, bool buildings3d, S
return false;
}
Aggregator aggregator(f, mainGeomType, zoomLevel, keys.size());
aggregator.AggregateKeys(keys);
CaptionDescription & descr = s.GetCaptionDescriptionImpl();
descr.Init(f, zoomLevel, mainGeomType, aggregator.m_mainTextType, aggregator.m_auxCaptionFound);
KeyFunctor keyFunctor(f, mainGeomType, zoomLevel, keys.size(), descr);
for (auto const & key : keys)
keyFunctor.ProcessKey(key);
aggregator.AggregateStyleFlags(keys, descr.IsNameExists());
if (keyFunctor.m_pointStyleFound)
if (aggregator.m_pointStyleFound)
s.RaisePointStyleFlag();
if (keyFunctor.m_lineStyleFound)
if (aggregator.m_lineStyleFound)
s.RaiseLineStyleFlag();
s.m_rules.swap(keyFunctor.m_rules);
if (keyFunctor.m_descrInit)
descr.FormatCaptions(f, mainGeomType, keyFunctor.m_mainTextType, keyFunctor.m_auxCaptionFound);
s.m_rules.swap(aggregator.m_rules);
return true;
}
@ -413,14 +393,11 @@ double GetFeaturePriority(FeatureType const & f, int const zoomLevel)
feature::EGeomType const mainGeomType = feature::EGeomType(geomType.first);
CaptionDescription descr;
KeyFunctor keyFunctor(f, mainGeomType, zoomLevel, keys.size(), descr);
for (auto const & key : keys)
keyFunctor.ProcessKey(key);
Aggregator aggregator(f, mainGeomType, zoomLevel, keys.size());
aggregator.AggregateKeys(keys);
double maxPriority = kMinPriority;
for (auto const & rule : keyFunctor.m_rules)
for (auto const & rule : aggregator.m_rules)
{
if (rule.second > maxPriority)
maxPriority = rule.second;

View file

@ -18,12 +18,10 @@ namespace df
struct CaptionDescription
{
void Init(FeatureType const & f,
int const zoomLevel);
void FormatCaptions(FeatureType const & f,
feature::EGeomType type,
drule::text_type_t mainTextType,
bool auxCaptionExists);
int const zoomLevel,
feature::EGeomType const type,
drule::text_type_t const mainTextType,
bool const auxCaptionExists);
string const & GetMainText() const;
string const & GetAuxText() const;
@ -32,10 +30,11 @@ struct CaptionDescription
bool IsNameExists() const;
private:
void SwapCaptions(int const zoomLevel);
void DiscardLongCaption(int const zoomLevel);
/// Clear aux name on high zoom and clear long main name on low zoom.
void ProcessZoomLevel(int const zoomLevel);
/// Try to use house number as name of the object.
void ProcessMainTextType(drule::text_type_t const & mainTextType);
private:
string m_mainText;
string m_auxText;
string m_roadNumber;

View file

@ -106,8 +106,7 @@ bool GetPopulation(FeatureType const & ft, uint32_t & population)
// Feature tag value evaluator for tag 'name'
bool GetName(FeatureType const & ft, string & name)
{
string intName;
ft.GetPreferredNames(name, intName);
ft.GetReadableName(name);
return true;
}

View file

@ -8,6 +8,8 @@
#include "indexer/feature_visibility.hpp"
#include "indexer/osm_editor.hpp"
#include "platform/preferred_languages.hpp"
#include "geometry/distance.hpp"
#include "geometry/robust_orientation.hpp"
@ -487,13 +489,19 @@ FeatureType::geom_stat_t FeatureType::GetTrianglesSize(int scale) const
return geom_stat_t(sz, m_triangles.size());
}
void FeatureType::GetPreferredNames(string & defaultName, string & intName) const
void FeatureType::GetPreferredNames(string & primary, string & secondary) const
{
if (!HasName())
return;
auto const mwmInfo = GetID().m_mwmId.GetInfo();
if (!mwmInfo)
return;
ParseCommon();
::GetPreferredNames(GetID(), GetNames(), defaultName, intName);
auto const deviceLang = StringUtf8Multilang::GetLangIndex(languages::GetCurrentNorm());
::GetPreferredNames(mwmInfo->GetRegionData(), GetNames(), deviceLang, primary, secondary);
}
void FeatureType::GetReadableName(string & name) const
@ -501,8 +509,14 @@ void FeatureType::GetReadableName(string & name) const
if (!HasName())
return;
auto const mwmInfo = GetID().m_mwmId.GetInfo();
if (!mwmInfo)
return;
ParseCommon();
::GetReadableName(GetID(), GetNames(), name);
auto const deviceLang = StringUtf8Multilang::GetLangIndex(languages::GetCurrentNorm());
::GetReadableName(mwmInfo->GetRegionData(), GetNames(), deviceLang, name);
}
string FeatureType::GetHouseNumber() const

View file

@ -7,8 +7,6 @@
#include "geometry/point2d.hpp"
#include "platform/preferred_languages.hpp"
#include "coding/multilang_utf8_string.hpp"
#include "base/base.hpp"
@ -17,15 +15,12 @@
namespace
{
void GetMwmLangName(FeatureID const & id, StringUtf8Multilang const & src, string & out)
using StrUtf8 = StringUtf8Multilang;
void GetMwmLangName(feature::RegionData const & regionData, StringUtf8Multilang const & src, string & out)
{
auto const mwmInfo = id.m_mwmId.GetInfo();
if (!mwmInfo)
return;
vector<int8_t> mwmLangCodes;
mwmInfo->GetRegionData().GetLanguages(mwmLangCodes);
regionData.GetLanguages(mwmLangCodes);
for (auto const code : mwmLangCodes)
{
@ -34,22 +29,9 @@ void GetMwmLangName(FeatureID const & id, StringUtf8Multilang const & src, strin
}
}
void GetNames(FeatureID const & id, StringUtf8Multilang const & src, string & primary,
string & secondary)
void GetBestName(StringUtf8Multilang const & src, vector<int8_t> const & priorityList, string & out)
{
primary.clear();
secondary.clear();
if (src.IsEmpty())
return;
vector<int8_t> primaryCodes = {StringUtf8Multilang::kDefaultCode};
vector<int8_t> secondaryCodes = {StringUtf8Multilang::GetLangIndex(languages::GetCurrentNorm()),
StringUtf8Multilang::kInternationalCode,
StringUtf8Multilang::kEnglishCode};
auto primaryIndex = primaryCodes.size();
auto secondaryIndex = secondaryCodes.size();
auto bestIndex = priorityList.size();
auto const findAndSet = [](vector<int8_t> const & langs, int8_t const code, string const & name,
size_t & bestIndex, string & outName)
@ -64,23 +46,19 @@ void GetNames(FeatureID const & id, StringUtf8Multilang const & src, string & pr
src.ForEach([&](int8_t code, string const & name)
{
if (primaryIndex != 0)
findAndSet(primaryCodes, code, name, primaryIndex, primary);
if (bestIndex == 0)
return false;
if (secondaryIndex != 0)
findAndSet(secondaryCodes, code, name, secondaryIndex, secondary);
findAndSet(priorityList, code, name, bestIndex, out);
return true;
});
if (primary.empty())
GetMwmLangName(id, src, primary);
if (secondaryIndex < secondaryCodes.size() &&
secondaryCodes[secondaryIndex] == StringUtf8Multilang::kInternationalCode)
// There are many "junk" names in Arabian island.
if (bestIndex < priorityList.size() &&
priorityList[bestIndex] == StrUtf8::kInternationalCode)
{
// There are many "junk" names in Arabian island.
secondary = secondary.substr(0, secondary.find_first_of(','));
out = out.substr(0, out.find_first_of(','));
}
}
} // namespace
@ -225,41 +203,54 @@ int GetFeatureViewportScale(TypesHolder const & types)
return impl::GetFeatureEstimator().GetViewportScale(types);
}
void GetPreferredNames(FeatureID const & id, StringUtf8Multilang const & src, string & primary,
string & secondary)
void GetPreferredNames(RegionData const & regionData, StringUtf8Multilang const & src,
int8_t const deviceLang, string & primary, string & secondary)
{
// Primary name using priority:
// - default name;
// - country language name.
// Secondary name using priority:
// - device language name;
// - international name;
// - english name.
GetNames(id, src, primary, secondary);
primary.clear();
secondary.clear();
if (src.IsEmpty())
return;
vector<int8_t> const primaryCodes = {deviceLang,
StrUtf8::kInternationalCode,
StrUtf8::kEnglishCode};
vector<int8_t> secondaryCodes = {StrUtf8::kDefaultCode,
StrUtf8::kInternationalCode};
vector<int8_t> mwmLangCodes;
regionData.GetLanguages(mwmLangCodes);
secondaryCodes.insert(secondaryCodes.end(), mwmLangCodes.begin(), mwmLangCodes.end());
secondaryCodes.push_back(StrUtf8::kEnglishCode);
GetBestName(src, primaryCodes, primary);
GetBestName(src, secondaryCodes, secondary);
if (primary.empty())
{
primary.swap(secondary);
}
else
{
// Filter out similar intName.
if (!secondary.empty() && primary.find(secondary) != string::npos)
secondary.clear();
}
primary.swap(secondary);
else if (!secondary.empty() && primary.find(secondary) != string::npos)
secondary.clear();
}
void GetReadableName(FeatureID const & id, StringUtf8Multilang const & src, string & out)
void GetReadableName(RegionData const & regionData, StringUtf8Multilang const & src,
int8_t const deviceLang, string & out)
{
// Names using priority:
// - device language name;
// - international name;
// - english name;
// - default name;
// - country language name.
// Secondary name is preffered to display on the map and place page.
string primary, secondary;
GetNames(id, src, primary, secondary);
out = secondary.empty() ? primary : secondary;
out.clear();
if (src.IsEmpty())
return;
vector<int8_t> codes;
// If MWM contains user's language.
if (regionData.HasLanguage(deviceLang))
codes = {deviceLang, StrUtf8::kDefaultCode, StrUtf8::kInternationalCode, StrUtf8::kEnglishCode};
else
codes = {deviceLang, StrUtf8::kInternationalCode, StrUtf8::kEnglishCode, StrUtf8::kDefaultCode};
GetBestName(src, codes, out);
if (out.empty())
GetMwmLangName(regionData, src, out);
}
} // namespace feature

View file

@ -10,11 +10,37 @@ class StringUtf8Multilang;
namespace feature
{
class TypesHolder;
class RegionData;
/// Get viewport scale to show given feature. Used in search.
int GetFeatureViewportScale(TypesHolder const & types);
void GetPreferredNames(FeatureID const & id, StringUtf8Multilang const & src, string & primary,
string & secondary);
void GetReadableName(FeatureID const & id, StringUtf8Multilang const & src, string & out);
/// Primary name using priority:
/// - device language name;
/// - international name;
/// - english name.
/// Secondary name using priority:
/// - default name;
/// - international name;
/// - country language name;
/// - english name.
/// In case when primary name is empty it will be propagated from secondary and secondary will be
/// cleared. In case when primary name contains secondary name then secondary will be cleared.
void GetPreferredNames(RegionData const & regionData, StringUtf8Multilang const & src,
int8_t const deviceLang, string & primary, string & secondary);
/// When MWM contains user's language, the priority is the following:
/// - device language name;
/// - default name;
/// - international name;
/// - english name;
/// - country language name.
/// When MWM does not contain user's language, the priority is the following:
/// - device language name;
/// - international name;
/// - english name;
/// - default name;
/// - country language name.
void GetReadableName(RegionData const & regionData, StringUtf8Multilang const & src,
int8_t const deviceLang, string & out);
} // namespace feature

View file

@ -1,39 +1,314 @@
#include "testing/testing.hpp"
#include "indexer/feature_utils.hpp"
#include "indexer/features_vector.hpp"
#include "indexer/index.hpp"
#include "indexer/mwm_set.hpp"
#include "platform/local_country_file.hpp"
#include "platform/preferred_languages.hpp"
using namespace platform;
namespace
{
UNIT_TEST(GetFeatureNames)
using StrUtf8 = StringUtf8Multilang;
UNIT_TEST(GetPrefferedNames)
{
LocalCountryFile localFile = LocalCountryFile::MakeForTesting("minsk-pass");
feature::RegionData regionData;
regionData.SetLanguages({"de", "ko"});
Index index;
auto result = index.RegisterMap(localFile);
TEST_EQUAL(result.second, MwmSet::RegResult::Success, ());
int8_t deviceLang = StrUtf8::GetLangIndex("ru");
string primary, secondary;
auto const & id = result.first;
MwmSet::MwmHandle handle = index.GetMwmHandleById(id);
TEST(handle.IsAlive(), ());
auto const * value = handle.GetValue<MwmValue>();
FeaturesVector fv(value->m_cont, value->GetHeader(), value->m_table.get());
string primary, secondary, readable;
fv.ForEach([&](FeatureType & ft, uint32_t /* index */)
{
ft.GetPreferredNames(primary, secondary);
if (!secondary.empty())
{
ft.GetReadableName(readable);
TEST_EQUAL(secondary, readable, ());
}
});
StrUtf8 src;
src.AddString("fr", "fr name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "", ());
TEST_EQUAL(secondary, "", ());
}
{
StrUtf8 src;
src.AddString("default", "default name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "default name", ());
TEST_EQUAL(secondary, "", ());
}
{
StrUtf8 src;
src.AddString("default", "default name");
src.AddString("en", "en name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "en name", ());
TEST_EQUAL(secondary, "default name", ());
}
{
StrUtf8 src;
src.AddString("default", "default name");
src.AddString("en", "en name");
src.AddString("ru", "ru name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "ru name", ());
TEST_EQUAL(secondary, "default name", ());
}
{
StrUtf8 src;
src.AddString("default", "same name");
src.AddString("en", "en name");
src.AddString("ru", "same name");
src.AddString("int_name", "int name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "same name", ());
TEST_EQUAL(secondary, "", ());
}
{
StrUtf8 src;
src.AddString("default", "default name");
src.AddString("en", "en name");
src.AddString("ru", "ru name");
src.AddString("int_name", "int name");
src.AddString("de", "de name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "ru name", ());
TEST_EQUAL(secondary, "default name", ());
}
{
StrUtf8 src;
src.AddString("default", "default name");
src.AddString("en", "en name");
src.AddString("ru", "ru name");
src.AddString("int_name", "int name");
src.AddString("de", "de name");
src.AddString("ko", "ko name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "ru name", ());
TEST_EQUAL(secondary, "default name", ());
}
{
StrUtf8 src;
src.AddString("default", "default name");
src.AddString("en", "en name");
src.AddString("int_name", "int name");
src.AddString("de", "de name");
src.AddString("ko", "ko name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "int name", ());
TEST_EQUAL(secondary, "default name", ());
}
{
StrUtf8 src;
src.AddString("en", "en name");
src.AddString("int_name", "int name");
src.AddString("de", "de name");
src.AddString("ko", "ko name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "int name", ());
TEST_EQUAL(secondary, "", ());
}
{
StrUtf8 src;
src.AddString("en", "en name");
src.AddString("de", "de name");
src.AddString("ko", "ko name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "en name", ());
TEST_EQUAL(secondary, "de name", ());
}
{
StrUtf8 src;
src.AddString("en", "en name");
src.AddString("ko", "ko name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "en name", ());
TEST_EQUAL(secondary, "ko name", ());
}
{
StrUtf8 src;
src.AddString("en", "en name");
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
TEST_EQUAL(primary, "en name", ());
TEST_EQUAL(secondary, "", ());
}
}
UNIT_TEST(GetReadableName)
{
feature::RegionData regionData;
regionData.SetLanguages({"de", "ko"});
int8_t deviceLang = StrUtf8::GetLangIndex("ru");
string name;
{
StrUtf8 src;
src.AddString("fr", "fr name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "ko name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("de", "de name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "de name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("de", "de name");
src.AddString("default", "default name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "default name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("de", "de name");
src.AddString("default", "default name");
src.AddString("en", "en name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "en name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("de", "de name");
src.AddString("default", "default name");
src.AddString("en", "en name");
src.AddString("int_name", "int name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "int name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("de", "de name");
src.AddString("default", "default name");
src.AddString("en", "en name");
src.AddString("int_name", "int name");
src.AddString("ru", "ru name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "ru name", ());
}
deviceLang = StrUtf8::GetLangIndex("de");
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("de", "de name");
src.AddString("default", "default name");
src.AddString("en", "en name");
src.AddString("int_name", "int name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "de name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("default", "default name");
src.AddString("en", "en name");
src.AddString("int_name", "int name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "default name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("en", "en name");
src.AddString("int_name", "int name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "int name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
src.AddString("en", "en name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "en name", ());
}
{
StrUtf8 src;
src.AddString("ko", "ko name");
feature::GetReadableName(regionData, src, deviceLang, name);
TEST_EQUAL(name, "ko name", ());
}
}
} // namespace

View file

@ -197,14 +197,10 @@ static NSString * const kAlertControllerNibIdentifier = @"MWMAlertViewController
}
[UIView animateWithDuration:kDefaultAnimationDuration
animations:^{
for (MWMAlert * view in self.view.subviews)
view.alpha = 0.0;
}
completion:^(BOOL finished) {
for (MWMAlert * view in self.view.subviews)
{
if (view != alert)
view.hidden = YES;
view.alpha = 0.0;
}
}];
@ -229,8 +225,6 @@ static NSString * const kAlertControllerNibIdentifier = @"MWMAlertViewController
NSArray * subviews = self.view.subviews;
MWMAlert * closeAlert = subviews.lastObject;
MWMAlert * showAlert = (subviews.count >= 2 ? subviews[subviews.count - 2] : nil);
if (showAlert)
showAlert.hidden = NO;
[UIView animateWithDuration:kDefaultAnimationDuration
animations:^{
closeAlert.alpha = 0.;

View file

@ -96,21 +96,10 @@ CGFloat const kAnimationDuration = .05;
NSAssert(!countries.empty(), @"countries can not be empty.");
MWMDownloadTransitMapAlert * alert = [[[NSBundle mainBundle] loadNibNamed:kDownloadTransitMapAlertNibName owner:nil options:nil] firstObject];
NSMutableArray<NSString *> * titles = [@[] mutableCopy];
TMwmSize totalSize = 0;
auto const & s = GetFramework().GetStorage();
for (auto const & countryId : countries)
{
storage::NodeAttrs attrs;
s.GetNodeAttrs(countryId, attrs);
[titles addObject:@(attrs.m_nodeLocalName.c_str())];
totalSize += attrs.m_mwmSize;
}
alert->m_countries = countries;
alert.countriesNames = titles;
alert.countriesSize = formattedSize(totalSize);
[alert configure];
[alert updateCountriesList];
[MWMFrameworkListener addObserver:alert];
return alert;
}
@ -121,6 +110,26 @@ CGFloat const kAnimationDuration = .05;
[self.dialogsTableView reloadData];
}
- (void)updateCountriesList
{
auto const & s = GetFramework().GetStorage();
m_countries.erase(
remove_if(m_countries.begin(), m_countries.end(),
[&s](TCountryId const & countryId) { return s.IsNodeDownloaded(countryId); }),
m_countries.end());
NSMutableArray<NSString *> * titles = [@[] mutableCopy];
TMwmSize totalSize = 0;
for (auto const & countryId : m_countries)
{
storage::NodeAttrs attrs;
s.GetNodeAttrs(countryId, attrs);
[titles addObject:@(attrs.m_nodeLocalName.c_str())];
totalSize += attrs.m_mwmSize;
}
self.countriesNames = titles;
self.countriesSize = formattedSize(totalSize);
}
#pragma mark - MWMCircularProgressProtocol
- (void)progressButtonPressed:(nonnull MWMCircularProgress *)progress
@ -134,22 +143,38 @@ CGFloat const kAnimationDuration = .05;
- (void)processCountryEvent:(TCountryId const &)countryId
{
auto const & s = GetFramework().GetStorage();
auto const & p = GetFramework().GetDownloadingPolicy();
if (s.CheckFailedCountries(m_countries))
{
if (p.IsAutoRetryDownloadFailed())
[self close:nil];
if (find(m_countries.begin(), m_countries.end(), countryId) == m_countries.end())
return;
if (self.rightButton.hidden)
{
auto const & s = GetFramework().GetStorage();
auto const & p = GetFramework().GetDownloadingPolicy();
if (s.CheckFailedCountries(m_countries))
{
if (p.IsAutoRetryDownloadFailed())
[self close:nil];
return;
}
auto const overallProgress = s.GetOverallProgress(m_countries);
// Test if downloading has finished by comparing downloaded and total sizes.
if (overallProgress.first == overallProgress.second)
[self close:self.downloadCompleteBlock];
}
else
{
[self updateCountriesList];
[self.dialogsTableView reloadSections:[NSIndexSet indexSetWithIndex:0]
withRowAnimation:UITableViewRowAnimationAutomatic];
if (m_countries.empty())
[self close:self.downloadCompleteBlock];
}
auto const overallProgress = s.GetOverallProgress(m_countries);
// Test if downloading has finished by comparing downloaded and total sizes.
if (overallProgress.first == overallProgress.second)
[self close:self.downloadCompleteBlock];
}
- (void)processCountry:(TCountryId const &)countryId progress:(MapFilesDownloader::TProgress const &)progress
{
if (!self.rightButton.hidden ||
find(m_countries.begin(), m_countries.end(), countryId) == m_countries.end())
return;
auto const overallProgress = GetFramework().GetStorage().GetOverallProgress(m_countries);
CGFloat const progressValue = static_cast<CGFloat>(overallProgress.first) / overallProgress.second;
self.progress.progress = progressValue;
@ -167,9 +192,13 @@ CGFloat const kAnimationDuration = .05;
- (IBAction)downloadButtonTap
{
[Statistics logEvent:kStatisticsEvent withParameters:@{kStatAction : kStatApply}];
self.downloadBlock(m_countries, ^
[self updateCountriesList];
if (m_countries.empty())
{
[MWMFrameworkListener addObserver:self];
[self close:self.downloadCompleteBlock];
return;
}
self.downloadBlock(m_countries, ^{
self.titleLabel.text = L(@"downloading");
self.messageLabel.hidden = YES;
self.progressWrapper.hidden = NO;
@ -180,7 +209,10 @@ CGFloat const kAnimationDuration = .05;
self.rightButton.hidden = YES;
self.dialogsBottomOffset.priority = UILayoutPriorityDefaultHigh;
self.progressWrapperBottomOffset.priority = UILayoutPriorityDefaultHigh;
[UIView animateWithDuration:kAnimationDuration animations:^{ [self layoutSubviews]; }];
[UIView animateWithDuration:kAnimationDuration
animations:^{
[self layoutSubviews];
}];
});
}
@ -251,6 +283,12 @@ CGFloat const kAnimationDuration = .05;
[self invalidateTableConstraintWithHeight:height];
}
- (void)close:(TMWMVoidBlock)completion
{
[MWMFrameworkListener removeObserver:self];
[super close:completion];
}
#pragma mark - UITableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
@ -292,11 +330,10 @@ CGFloat const kAnimationDuration = .05;
- (MWMDownloaderDialogHeader *)listHeader
{
if (!_listHeader)
{
NSString * title = [NSString stringWithFormat:@"%@ (%@)", L(@"maps"), @(m_countries.size())];
NSString * size = self.countriesSize;
_listHeader = [MWMDownloaderDialogHeader headerForOwnerAlert:self title:title size:size];
}
_listHeader = [MWMDownloaderDialogHeader headerForOwnerAlert:self];
[_listHeader setTitle:[NSString stringWithFormat:@"%@ (%@)", L(@"maps"), @(m_countries.size())]
size:self.countriesSize];
return _listHeader;
}

View file

@ -6,7 +6,9 @@
@property (weak, nonatomic) IBOutlet UIButton * headerButton;
@property (weak, nonatomic) IBOutlet UIImageView * expandImage;
+ (instancetype)headerForOwnerAlert:(MWMDownloadTransitMapAlert *)alert title:(NSString *)title size:(NSString *)size;
+ (instancetype)headerForOwnerAlert:(MWMDownloadTransitMapAlert *)alert;
- (void)layoutSizeLabel;
- (void)setTitle:(NSString *)title size:(NSString *)size;
@end

View file

@ -18,11 +18,9 @@ static NSString * const kDownloaderDialogHeaderNibName = @"MWMDownloaderDialogHe
@implementation MWMDownloaderDialogHeader
+ (instancetype)headerForOwnerAlert:(MWMDownloadTransitMapAlert *)alert title:(NSString *)title size:(NSString *)size;
+ (instancetype)headerForOwnerAlert:(MWMDownloadTransitMapAlert *)alert
{
MWMDownloaderDialogHeader * header = [[[NSBundle mainBundle] loadNibNamed:kDownloaderDialogHeaderNibName owner:nil options:nil] firstObject];
header.title.text = title;
header.size.text = size;
header.ownerAlert = alert;
return header;
}
@ -48,4 +46,10 @@ static NSString * const kDownloaderDialogHeaderNibName = @"MWMDownloaderDialogHe
[self layoutIfNeeded];
}
- (void)setTitle:(NSString *)title size:(NSString *)size
{
self.title.text = title;
self.size.text = size;
}
@end

View file

@ -122,10 +122,10 @@
<constraint firstItem="dVz-cc-LUM" firstAttribute="centerY" secondItem="FpX-u9-FuR" secondAttribute="centerY" id="yEP-oH-4ti"/>
</constraints>
</view>
<button hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pLD-sZ-ejH" userLabel="Go" customClass="MWMStartButton">
<button hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="501" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pLD-sZ-ejH" userLabel="Go" customClass="MWMStartButton">
<accessibility key="accessibilityConfiguration" identifier="goButton"/>
<constraints>
<constraint firstAttribute="width" constant="96" id="ZHw-Ha-INX"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="96" id="ZHw-Ha-INX"/>
</constraints>
<inset key="contentEdgeInsets" minX="8" minY="0.0" maxX="8" maxY="0.0"/>
<state key="normal" title="Start"/>
@ -275,6 +275,9 @@
<size key="footerReferenceSize" width="0.0" height="0.0"/>
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
</collectionViewFlowLayout>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
</userDefinedRuntimeAttributes>
</collectionView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
@ -284,6 +287,9 @@
<constraint firstAttribute="trailing" secondItem="pUj-hX-AzZ" secondAttribute="trailing" id="pgB-jZ-CDF"/>
<constraint firstAttribute="bottom" secondItem="pUj-hX-AzZ" secondAttribute="bottom" id="pt8-Js-FpC"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
@ -324,6 +330,9 @@
<constraint firstAttribute="trailing" secondItem="mab-rl-ueg" secondAttribute="trailing" id="w4c-fR-znA"/>
<constraint firstItem="nD5-wx-7Ui" firstAttribute="bottom" secondItem="4Xc-Kl-hAm" secondAttribute="bottom" priority="500" id="wq2-oV-MOH"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
</userDefinedRuntimeAttributes>
</view>
<button opaque="NO" contentMode="center" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YLY-C4-SBu" userLabel="Menu" customClass="MWMButton">
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>

View file

@ -110,6 +110,7 @@ using TInfoDisplays = NSHashTable<__kindof TInfoDisplay>;
if (IPAD && self.state != MWMNavigationDashboardStateNavigation)
[self.delegate routePreviewDidChangeFrame:{}];
[[MWMRouter router] stop];
self.taxiDataSource = nil;
}
#pragma mark - MWMTaxiDataSource

View file

@ -73,6 +73,9 @@
<constraint firstItem="TWl-RV-DGe" firstAttribute="top" secondItem="til-vK-WGY" secondAttribute="bottom" constant="4" id="nPU-Y1-NJP"/>
</constraints>
<size key="customSize" width="251" height="44"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="icon" destination="fMe-7t-K8o" id="Q6r-Xu-ubl"/>
<outlet property="price" destination="eYn-L4-OCN" id="fbl-b4-YcH"/>

View file

@ -259,7 +259,7 @@
</userDefinedRuntimeAttributes>
</collectionView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="t6d-gI-JcN" firstAttribute="top" secondItem="xAP-RW-zvp" secondAttribute="top" id="Q7e-1w-LMz"/>
<constraint firstItem="t6d-gI-JcN" firstAttribute="leading" secondItem="xAP-RW-zvp" secondAttribute="leading" id="TYJ-1W-jS1"/>

View file

@ -11,7 +11,7 @@ NSString * titleForButton(EButton type, BOOL isSelected)
return L(@"back");
case EButton::Booking:
case EButton::Opentable:
return L(@"bookingcom_book_button");
return L(@"book_button");
case EButton::Call:
return L(@"placepage_call_button");
case EButton::Bookmark:

View file

@ -123,15 +123,14 @@ enum RowInMetaInfo
else
{
Framework & f = GetFramework();
auto const & bac = self.data.bac;
BookmarkCategory * category = f.GetBmCategory(bac.m_categoryIndex);
BookmarkCategory * category = f.GetBmCategory(m_cachedBac.m_categoryIndex);
if (!category)
return;
{
BookmarkCategory::Guard guard(*category);
Bookmark * bookmark =
static_cast<Bookmark *>(guard.m_controller.GetUserMarkForEdit(bac.m_bookmarkIndex));
static_cast<Bookmark *>(guard.m_controller.GetUserMarkForEdit(m_cachedBac.m_bookmarkIndex));
if (!bookmark)
return;

View file

@ -24,7 +24,8 @@ NSString * breaksFromClosedTime(TTimespans const & closedTimes)
{
if (i)
[breaks appendString:@"\n"];
[breaks appendString:stringFromTimeSpan(closedTimes[i])];
[breaks appendString:[NSString stringWithFormat:@"%@ %@", L(@"editor_hours_closed"),
stringFromTimeSpan(closedTimes[i])]];
}
return breaks.copy;
}

View file

@ -289,6 +289,7 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
auto const & sections = self.data.sections;
switch (status)
{
case NodeStatus::OnDiskOutOfDate:
case NodeStatus::Undefined:
{
self.isPlacePageButtonsEnabled = NO;
@ -323,7 +324,6 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
break;
}
case NodeStatus::Partly: break;
case NodeStatus::OnDiskOutOfDate:
case NodeStatus::OnDisk:
{
self.isPlacePageButtonsEnabled = YES;
@ -556,8 +556,11 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
MWMPlacePageButtonCell * c = [tableView dequeueReusableCellWithIdentifier:kButtonsCells[0]];
auto const row = data.buttonsRows[indexPath.row];
[c configForRow:row withDelegate:delegate];
if (row != ButtonsRows::HotelDescription)
[c setEnabled:self.isPlacePageButtonsEnabled];
else
[c setEnabled:YES];
return c;
}

View file

@ -466,6 +466,10 @@ using namespace osm_auth_ios;
}
else
{
if ([MWMSettings statisticsEnabled])
[Alohalytics enable];
else
[Alohalytics disable];
[self incrementSessionsCountAndCheckForAlert];
[MapsAppDelegate initPushNotificationsWithLaunchOptions:launchOptions];
}
@ -936,6 +940,7 @@ using namespace osm_auth_ios;
- (void)firstLaunchSetup
{
[MWMSettings setStatisticsEnabled:YES];
NSString * currentVersion =
[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
NSUserDefaults * standartDefaults = [NSUserDefaults standardUserDefaults];

View file

@ -108,6 +108,8 @@
switch (state)
{
case MWMMigrationViewState::Default:
self.primaryButton.hidden = NO;
self.secondaryButton.hidden = NO;
break;
case MWMMigrationViewState::Processing:
self.info.hidden = NO;
@ -121,15 +123,15 @@
self.info.hidden = NO;
self.info.textColor = [UIColor red];
self.info.text = L(@"common_check_internet_connection_dialog");
self.primaryButton.enabled = NO;
self.secondaryButton.enabled = NO;
self.primaryButton.hidden = YES;
self.secondaryButton.hidden = YES;
break;
case MWMMigrationViewState::ErrorNoSpace:
self.info.hidden = NO;
self.info.textColor = [UIColor red];
self.info.text = L(@"migration_no_space_message");
self.primaryButton.enabled = NO;
self.secondaryButton.enabled = NO;
self.primaryButton.hidden = YES;
self.secondaryButton.hidden = YES;
break;
}
_state = state;

View file

@ -3505,7 +3505,7 @@
ORGANIZATIONNAME = MapsWithMe;
TargetAttributes = {
1D6058900D05DD3D006BFB54 = {
DevelopmentTeam = 3T6FSDE8C7;
DevelopmentTeam = L2QFT5NA2Q;
ProvisioningStyle = Automatic;
SystemCapabilities = {
com.apple.ApplicationGroups.iOS = {
@ -4786,7 +4786,7 @@
BUNDLE_IDENTIFIER = "com.my.maps-beta-enterprise";
CURRENT_PROJECT_VERSION = 6.5.0;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 3T6FSDE8C7;
DEVELOPMENT_TEAM = L2QFT5NA2Q;
ENABLE_BITCODE = NO;
GCC_ENABLE_PASCAL_STRINGS = NO;
GCC_INLINES_ARE_PRIVATE_EXTERN = YES;

View file

@ -53,7 +53,7 @@
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" navigationBarHidden="YES" id="Wns-nH-AQU" customClass="MWMNavigationController" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="OK2-RC-YDq">
<navigationBar key="navigationBar" contentMode="scaleToFill" misplaced="YES" id="OK2-RC-YDq">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@ -1214,7 +1214,7 @@
<objects>
<navigationController id="Psz-BY-Fy4" customClass="MWMNavigationController" sceneMemberID="viewController">
<value key="contentSizeForViewInPopover" type="size" width="600" height="600"/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="SUN-3A-xgM">
<navigationBar key="navigationBar" contentMode="scaleToFill" misplaced="YES" id="SUN-3A-xgM">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@ -3032,7 +3032,7 @@
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Для обновления требуется больше свободного места. Пожалуйста, удалите ненужный контент." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="400" translatesAutoresizingMaskIntoConstraints="NO" id="9dB-cn-qbb" userLabel="State">
<rect key="frame" x="-21.5" y="401" width="363" height="33"/>
<rect key="frame" x="12" y="401" width="296" height="33"/>
<constraints>
<constraint firstAttribute="width" priority="750" constant="400" id="gnK-Ra-PzL"/>
</constraints>
@ -3102,7 +3102,7 @@
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="ContainerView"/>
<constraints>
<constraint firstItem="9dB-cn-qbb" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Toe-vk-Vmp" secondAttribute="leading" priority="750" constant="12" id="4Wc-7I-5xu"/>
<constraint firstItem="9dB-cn-qbb" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Toe-vk-Vmp" secondAttribute="leading" priority="900" constant="12" id="4Wc-7I-5xu"/>
<constraint firstItem="3d5-wL-CHn" firstAttribute="centerX" secondItem="Toe-vk-Vmp" secondAttribute="centerX" id="8Mi-Ib-PsJ"/>
<constraint firstItem="OC0-ml-Jn7" firstAttribute="top" secondItem="Toe-vk-Vmp" secondAttribute="top" constant="36" id="G6M-AB-Kp0"/>
<constraint firstItem="7bw-ZT-3ea" firstAttribute="top" secondItem="4zz-rI-p8s" secondAttribute="bottom" priority="500" constant="10" id="JGY-SO-Jd5"/>
@ -3113,7 +3113,7 @@
<constraint firstItem="4zz-rI-p8s" firstAttribute="top" secondItem="OC0-ml-Jn7" secondAttribute="bottom" priority="250" constant="80" id="eff-ZO-eVk"/>
<constraint firstItem="7bw-ZT-3ea" firstAttribute="centerX" secondItem="Toe-vk-Vmp" secondAttribute="centerX" id="hLc-KL-B8u"/>
<constraint firstAttribute="bottom" secondItem="3d5-wL-CHn" secondAttribute="bottom" constant="36" id="jIy-bI-IQK"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="9dB-cn-qbb" secondAttribute="trailing" priority="750" constant="12" id="mib-fn-M58"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="9dB-cn-qbb" secondAttribute="trailing" priority="900" constant="12" id="mib-fn-M58"/>
<constraint firstAttribute="trailing" secondItem="OC0-ml-Jn7" secondAttribute="trailing" constant="16" id="oQ5-fG-W4E"/>
<constraint firstItem="4zz-rI-p8s" firstAttribute="top" secondItem="9dB-cn-qbb" secondAttribute="bottom" priority="250" constant="16" id="rHI-IH-sDQ"/>
<constraint firstItem="4zz-rI-p8s" firstAttribute="centerX" secondItem="Toe-vk-Vmp" secondAttribute="centerX" id="xcS-f1-5Fn"/>

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