[ios] Add Live Activity Widget for the TrackRecording #9482

Merged
root merged 9 commits from ios/add-live-activity-widget into master 2024-12-23 18:43:36 +00:00
114 changed files with 938 additions and 287 deletions

View file

@ -118,7 +118,7 @@
android:layout_marginTop="@dimen/margin_eighth"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/elevation_profile_maxaltitude"
android:text="@string/elevation_profile_max_elevation"
android:textAppearance="@style/MwmTextAppearance.Body5" />
<TextView
android:id="@+id/max_altitude"
@ -147,7 +147,7 @@
android:layout_marginTop="@dimen/margin_eighth"
android:ellipsize="end"
android:singleLine="true"
android:text="@string/elevation_profile_minaltitude"
android:text="@string/elevation_profile_min_elevation"
android:textAppearance="@style/MwmTextAppearance.Body5" />
<TextView
android:id="@+id/min_altitude"

View file

@ -778,8 +778,8 @@
<string name="isolines_location_error_dialog">الطبقة الطبوغرافية ليست متاحة بعد في هذه المنطقة</string>
<string name="elevation_profile_ascent">تصاعدي</string>
<string name="elevation_profile_descent">تنازلي</string>
<string name="elevation_profile_minaltitude">الحد الأدنى للارتفاع</string>
<string name="elevation_profile_maxaltitude">الحد الأقصى للارتفاع</string>
<string name="elevation_profile_min_elevation">أقل ارتفاع</string>
<string name="elevation_profile_max_elevation">أعلى ارتفاع</string>
<string name="elevation_profile_difficulty">درجة الصعوبة</string>
<string name="elevation_profile_distance">المسافة:</string>
<string name="elevation_profile_time">المدة:</string>

View file

@ -763,8 +763,8 @@
<string name="isolines_location_error_dialog">Bu bölgədə relyef təbəqəsi hələ mövcud deyil</string>
<string name="elevation_profile_ascent">Qalxmaq</string>
<string name="elevation_profile_descent">Eniş</string>
<string name="elevation_profile_minaltitude">Min. hündürlük</string>
<string name="elevation_profile_maxaltitude">Maks. hündürlük</string>
<string name="elevation_profile_min_elevation">Min. hündürlük</string>
<string name="elevation_profile_max_elevation">Maks. hündürlük</string>
<string name="elevation_profile_difficulty">Çətinlik</string>
<string name="elevation_profile_distance">Məsafə:</string>
<string name="elevation_profile_time">Müddət:</string>

View file

@ -760,8 +760,8 @@
<string name="isolines_location_error_dialog">Мапы рэльефа для гэтай мясцовасці пакуль што няма</string>
<string name="elevation_profile_ascent">Пад\'ём</string>
<string name="elevation_profile_descent">Спуск</string>
<string name="elevation_profile_minaltitude">Мін. вышыня</string>
<string name="elevation_profile_maxaltitude">Макс. вышыня</string>
<string name="elevation_profile_min_elevation">Мін. вышыня</string>
<string name="elevation_profile_max_elevation">Макс. вышыня</string>
<string name="elevation_profile_difficulty">Складанасць</string>
<string name="elevation_profile_distance">Адл.:</string>
<string name="elevation_profile_time">Час:</string>

View file

@ -689,8 +689,8 @@
<string name="isolines_location_error_dialog">Топографският слой все още не е наличен в тази област</string>
<string name="elevation_profile_ascent">Изкачване</string>
<string name="elevation_profile_descent">Спускане</string>
<string name="elevation_profile_minaltitude">Мин. надморска височина</string>
<string name="elevation_profile_maxaltitude">Макс. надморска височина</string>
<string name="elevation_profile_min_elevation">Мин. височина</string>
<string name="elevation_profile_max_elevation">Макс. височина</string>
<string name="elevation_profile_difficulty">Трудност</string>
<string name="elevation_profile_distance">Разст.:</string>
<string name="elevation_profile_time">Време:</string>

View file

@ -768,8 +768,8 @@
<string name="isolines_location_error_dialog">La capa topogràfica encara no és disponible en aquesta àrea</string>
<string name="elevation_profile_ascent">Ascens</string>
<string name="elevation_profile_descent">Descens</string>
<string name="elevation_profile_minaltitude">Altitud mín.</string>
<string name="elevation_profile_maxaltitude">Altitud màx.</string>
<string name="elevation_profile_min_elevation">Min. elevació</string>
<string name="elevation_profile_max_elevation">Màx. elevació</string>
<string name="elevation_profile_difficulty">Dificultat</string>
<string name="elevation_profile_distance">Dist.:</string>
<string name="elevation_profile_time">Temps:</string>

View file

@ -736,8 +736,8 @@
<string name="isolines_location_error_dialog">Topografická vrstva není v této oblasti ještě dostupná</string>
<string name="elevation_profile_ascent">Stoupání</string>
<string name="elevation_profile_descent">Klesání</string>
<string name="elevation_profile_minaltitude">Min. nadmořská výška</string>
<string name="elevation_profile_maxaltitude">Max. nadmořská výška</string>
<string name="elevation_profile_min_elevation">Min. výška</string>
<string name="elevation_profile_max_elevation">Max. výška</string>
<string name="elevation_profile_difficulty">Obtížnost</string>
<string name="elevation_profile_distance">Vzdál.:</string>
<string name="elevation_profile_time">Čas:</string>

View file

@ -726,8 +726,8 @@
<string name="isolines_location_error_dialog">Det topografiske lag er endnu ikke tilgængeligt i dette område</string>
<string name="elevation_profile_ascent">Stige op</string>
<string name="elevation_profile_descent">Stige ned</string>
<string name="elevation_profile_minaltitude">Min. højde</string>
<string name="elevation_profile_maxaltitude">Maks. højde</string>
<string name="elevation_profile_min_elevation">Min. højde</string>
<string name="elevation_profile_max_elevation">Maks. højde</string>
<string name="elevation_profile_difficulty">Vanskelighed</string>
<string name="elevation_profile_distance">Afs.:</string>
<string name="elevation_profile_time">Tid:</string>

View file

@ -765,8 +765,8 @@
<string name="isolines_location_error_dialog">Topographieebene ist für dieses Gebiet noch nicht verfügbar</string>
<string name="elevation_profile_ascent">Bergauf</string>
<string name="elevation_profile_descent">Bergab</string>
<string name="elevation_profile_minaltitude">Min. Höhe</string>
<string name="elevation_profile_maxaltitude">Max. Höhe</string>
<string name="elevation_profile_min_elevation">Min. Höhe</string>
<string name="elevation_profile_max_elevation">Max. Höhe</string>
<string name="elevation_profile_difficulty">Schwierigkeitsgrad</string>
<string name="elevation_profile_distance">Entf.:</string>
<string name="elevation_profile_time">Dauer:</string>

View file

@ -764,8 +764,8 @@
<string name="isolines_location_error_dialog">Οι υψομετρικές γραμμές δεν είναι ακόμα διαθέσιμες σε αυτή την περιοχή</string>
<string name="elevation_profile_ascent">Ανάβαση</string>
<string name="elevation_profile_descent">Κατάβαση</string>
<string name="elevation_profile_minaltitude">Ελάχ. υψόμετρο</string>
<string name="elevation_profile_maxaltitude">Μέγ. υψόμετρο</string>
<string name="elevation_profile_min_elevation">Ελάχ. υψόμετρο</string>
<string name="elevation_profile_max_elevation">Μέγ. υψόμετρο</string>
<string name="elevation_profile_difficulty">Δυσκολία</string>
<string name="elevation_profile_distance">Απόστ.:</string>
<string name="elevation_profile_time">Διάρκ:</string>

View file

@ -200,8 +200,8 @@
<string name="isolines_location_error_dialog">La altitud de relieve no está aún disponible en esta región</string>
<string name="elevation_profile_ascent">Ascenso</string>
<string name="elevation_profile_descent">Descenso</string>
<string name="elevation_profile_minaltitude">Altura mínima</string>
<string name="elevation_profile_maxaltitude">Altura máxima</string>
<string name="elevation_profile_min_elevation">Min. elevación</string>
<string name="elevation_profile_max_elevation">Máx. elevación</string>
<string name="elevation_profile_difficulty">Dificultad</string>
<string name="elevation_profile_distance">Distancia:</string>
<string name="elevation_profile_time">Lapso:</string>

View file

@ -763,8 +763,8 @@
<string name="isolines_location_error_dialog">La altitud de relieve aún no está disponible en esta región</string>
<string name="elevation_profile_ascent">Ascenso</string>
<string name="elevation_profile_descent">Descenso</string>
<string name="elevation_profile_minaltitude">Altura mínima</string>
<string name="elevation_profile_maxaltitude">Altura máxima</string>
<string name="elevation_profile_min_elevation">Min. elevación</string>
<string name="elevation_profile_max_elevation">Máx. elevación</string>
<string name="elevation_profile_difficulty">Dificultad</string>
<string name="elevation_profile_distance">Dist.:</string>
<string name="elevation_profile_time">Tiempo:</string>

View file

@ -759,8 +759,8 @@
<string name="isolines_location_error_dialog">Topograafiline kiht ei ole selles piirkonnas veel saadaval</string>
<string name="elevation_profile_ascent">Tõus</string>
<string name="elevation_profile_descent">Langus</string>
<string name="elevation_profile_minaltitude">Min. kõrgus</string>
<string name="elevation_profile_maxaltitude">Maks. kõrgus</string>
<string name="elevation_profile_min_elevation">Min. kõrgus</string>
<string name="elevation_profile_max_elevation">Maks. kõrgus</string>
<string name="elevation_profile_difficulty">Raskusaste</string>
<string name="elevation_profile_distance">Kaugus:</string>
<string name="elevation_profile_time">Aeg:</string>

View file

@ -763,8 +763,8 @@
<string name="isolines_location_error_dialog">Erliebearen altitudea oraindik ez dago eskuragarri eskualde honetan</string>
<string name="elevation_profile_ascent">Maldan gora</string>
<string name="elevation_profile_descent">Maldan behera</string>
<string name="elevation_profile_minaltitude">Gutxieneko altuera</string>
<string name="elevation_profile_maxaltitude">Gehieneko altuera</string>
<string name="elevation_profile_min_elevation">Min. altuera</string>
<string name="elevation_profile_max_elevation">Max. altuera</string>
<string name="elevation_profile_difficulty">Zailtasuna</string>
<string name="elevation_profile_distance">Distantzia:</string>
<string name="elevation_profile_time">Denbora:</string>

View file

@ -724,8 +724,8 @@
<string name="isolines_location_error_dialog">لایه توپوگرافی هنوز برای این منطقه در دسترس نیست</string>
<string name="elevation_profile_ascent">بالا رفتن</string>
<string name="elevation_profile_descent">پایین آمدن</string>
<string name="elevation_profile_minaltitude">کمینه ارتفاع</string>
<string name="elevation_profile_maxaltitude">بیشینه ارتفاع</string>
<string name="elevation_profile_min_elevation">کم ارتفاع</string>
<string name="elevation_profile_max_elevation">بیش ارتفاع</string>
<string name="elevation_profile_difficulty">دشواری</string>
<string name="elevation_profile_distance">مسافت</string>
<string name="elevation_profile_time">زمان:</string>

View file

@ -764,8 +764,8 @@
<string name="isolines_location_error_dialog">Korkeuskäyrät eivät ole vielä saatavilla tällä alueella</string>
<string name="elevation_profile_ascent">Nousua</string>
<string name="elevation_profile_descent">Laskua</string>
<string name="elevation_profile_minaltitude">Min. korkeus</string>
<string name="elevation_profile_maxaltitude">Maks. korkeus</string>
<string name="elevation_profile_min_elevation">Min. korkeus</string>
<string name="elevation_profile_max_elevation">Max. korkeus</string>
<string name="elevation_profile_difficulty">Vaikeus</string>
<string name="elevation_profile_distance">Etäisyys:</string>
<string name="elevation_profile_time">Aika:</string>

View file

@ -770,8 +770,8 @@
<string name="isolines_location_error_dialog">Les lignes d\'élévation ne sont pas encore disponibles dans cette région</string>
<string name="elevation_profile_ascent">Montée</string>
<string name="elevation_profile_descent">Descente</string>
<string name="elevation_profile_minaltitude">Hauteur minimale</string>
<string name="elevation_profile_maxaltitude">Hauteur maximale</string>
<string name="elevation_profile_min_elevation">Min. élévation</string>
<string name="elevation_profile_max_elevation">Max. élévation</string>
<string name="elevation_profile_difficulty">Difficulté</string>
<string name="elevation_profile_distance">Distance :</string>
<string name="elevation_profile_time">Temps :</string>

View file

@ -741,8 +741,8 @@
<string name="isolines_location_error_dialog">Ezen a területen a topográfiai réteg még nem elérhető</string>
<string name="elevation_profile_ascent">Felemelkedés</string>
<string name="elevation_profile_descent">Leereszkedés</string>
<string name="elevation_profile_minaltitude">Min. magasság</string>
<string name="elevation_profile_maxaltitude">Max. magasság</string>
<string name="elevation_profile_min_elevation">Min. magasság</string>
<string name="elevation_profile_max_elevation">Max. magasság</string>
<string name="elevation_profile_difficulty">Nehézség</string>
<string name="elevation_profile_distance">Táv.:</string>
<string name="elevation_profile_time">Idő</string>

View file

@ -730,8 +730,8 @@
<string name="isolines_location_error_dialog">Lapisan topografi belum tersedia untuk wilayah ini</string>
<string name="elevation_profile_ascent">Menanjak</string>
<string name="elevation_profile_descent">Menurun</string>
<string name="elevation_profile_minaltitude">Ketinggian Min.</string>
<string name="elevation_profile_maxaltitude">Ketinggian Maks.</string>
<string name="elevation_profile_min_elevation">Min. tinggi</string>
<string name="elevation_profile_max_elevation">Maks. tinggi</string>
<string name="elevation_profile_difficulty">Kesulitan</string>
<string name="elevation_profile_distance">Jarak:</string>
<string name="elevation_profile_time">Waktu:</string>

View file

@ -752,8 +752,8 @@
<string name="isolines_location_error_dialog">La modalità topografica per questa regione non è ancora disponibile</string>
<string name="elevation_profile_ascent">Salita</string>
<string name="elevation_profile_descent">Discesa</string>
<string name="elevation_profile_minaltitude">Altitudine minima</string>
<string name="elevation_profile_maxaltitude">Altitudine massima</string>
<string name="elevation_profile_min_elevation">Min. elevazione</string>
<string name="elevation_profile_max_elevation">Max. elevazione</string>
<string name="elevation_profile_difficulty">Difficoltà</string>
<string name="elevation_profile_distance">Dist.:</string>
<string name="elevation_profile_time">Tempo:</string>

View file

@ -760,8 +760,8 @@
<string name="isolines_location_error_dialog">קווי מתאר עוד לא זמינים לאזור זה</string>
<string name="elevation_profile_ascent">עלייה</string>
<string name="elevation_profile_descent">ירידה</string>
<string name="elevation_profile_minaltitude">גובה מינימלי</string>
<string name="elevation_profile_maxaltitude">גובה מקסימלי</string>
<string name="elevation_profile_min_elevation">מינ\' גובה</string>
<string name="elevation_profile_max_elevation">מקס\' גובה</string>
<string name="elevation_profile_difficulty">קושי</string>
<string name="elevation_profile_distance">מרחק:</string>
<string name="elevation_profile_time">זמן:</string>

View file

@ -766,8 +766,8 @@
<string name="isolines_location_error_dialog">地形レイヤーはこの地域ではまだ利用できません</string>
<string name="elevation_profile_ascent">上昇</string>
<string name="elevation_profile_descent">下降</string>
<string name="elevation_profile_minaltitude">最小高度</string>
<string name="elevation_profile_maxaltitude">最大高度</string>
<string name="elevation_profile_min_elevation">最小標高</string>
<string name="elevation_profile_max_elevation">最大標高</string>
<string name="elevation_profile_difficulty">難易度</string>
<string name="elevation_profile_distance">距離:</string>
<string name="elevation_profile_time">時間:</string>

View file

@ -728,8 +728,8 @@
<string name="isolines_location_error_dialog">이 지역의 지형 레이어는 아직 사용할 수 없습니다</string>
<string name="elevation_profile_ascent">올라가기</string>
<string name="elevation_profile_descent">내려가기</string>
<string name="elevation_profile_minaltitude">최소 높이</string>
<string name="elevation_profile_maxaltitude">최대 높이</string>
<string name="elevation_profile_min_elevation">최소 높이</string>
<string name="elevation_profile_max_elevation">최대 높이</string>
<string name="elevation_profile_difficulty">난이도</string>
<string name="elevation_profile_distance">거리:</string>
<string name="elevation_profile_time">소비 시간:</string>

View file

@ -768,8 +768,8 @@
<string name="isolines_location_error_dialog">Topogrāfiskais slānis šim reģionam nav pieejams</string>
<string name="elevation_profile_ascent">Kāpums</string>
<string name="elevation_profile_descent">Kritums</string>
<string name="elevation_profile_minaltitude">Zemākais punkts</string>
<string name="elevation_profile_maxaltitude">Augstākais punkts</string>
<string name="elevation_profile_min_elevation">Zemākais punkts</string>
<string name="elevation_profile_max_elevation">Augstākais punkts</string>
<string name="elevation_profile_difficulty">Sarežģītība</string>
<string name="elevation_profile_distance">Attālums:</string>
<string name="elevation_profile_time">Laiks:</string>

View file

@ -732,8 +732,8 @@
<string name="isolines_location_error_dialog">या भागात भूस्वरूप स्तर अद्याप उपलब्ध नाही</string>
<string name="elevation_profile_ascent">चढण</string>
<string name="elevation_profile_descent">उतरण</string>
<string name="elevation_profile_minaltitude">किमान उच्चता</string>
<string name="elevation_profile_maxaltitude">कमाल उच्चता</string>
<string name="elevation_profile_min_elevation">किमान उंची</string>
<string name="elevation_profile_max_elevation">कमाल उंची</string>
<string name="elevation_profile_difficulty">काठिण्य</string>
<string name="elevation_profile_distance">अंतर.:</string>
<string name="elevation_profile_time">वेळ:</string>

View file

@ -763,8 +763,8 @@
<string name="isolines_location_error_dialog">Høydekurver er ikke tilgjengelige i dette området ennå</string>
<string name="elevation_profile_ascent">Stigning</string>
<string name="elevation_profile_descent">Nedstigning</string>
<string name="elevation_profile_minaltitude">Min. høyde</string>
<string name="elevation_profile_maxaltitude">Maks. høyde</string>
<string name="elevation_profile_min_elevation">Min. høyde</string>
<string name="elevation_profile_max_elevation">Maks. høyde</string>
<string name="elevation_profile_difficulty">Vanskelighet</string>
<string name="elevation_profile_distance">Avstand:</string>
<string name="elevation_profile_time">I rute</string>

View file

@ -763,8 +763,8 @@
<string name="isolines_location_error_dialog">Hoogtelijnen zijn nog niet beschikbaar in deze regio</string>
<string name="elevation_profile_ascent">Stijging</string>
<string name="elevation_profile_descent">Daling</string>
<string name="elevation_profile_minaltitude">Min. hoogte</string>
<string name="elevation_profile_maxaltitude">Max. hoogte</string>
<string name="elevation_profile_min_elevation">Min. hoogte</string>
<string name="elevation_profile_max_elevation">Max. hoogte</string>
<string name="elevation_profile_difficulty">Moeilijkheid</string>
<string name="elevation_profile_distance">Afst.:</string>
<string name="elevation_profile_time">Tijd:</string>

View file

@ -769,8 +769,8 @@
<string name="isolines_location_error_dialog">Poziomice nie są jeszcze dostępne w tym regionie</string>
<string name="elevation_profile_ascent">Wejście</string>
<string name="elevation_profile_descent">Zejście</string>
<string name="elevation_profile_minaltitude">Min. wysokość</string>
<string name="elevation_profile_maxaltitude">Maks. wysokość</string>
<string name="elevation_profile_min_elevation">Min. wysokość</string>
<string name="elevation_profile_max_elevation">Maks. wysokość</string>
<string name="elevation_profile_difficulty">Trudność</string>
<string name="elevation_profile_distance">Odległ.:</string>
<string name="elevation_profile_time">Trasa:</string>

View file

@ -691,8 +691,8 @@
<string name="button_layer_isolines">Relevo</string>
<string name="isolines_activation_error_dialog">Para ativar e usar a camada Relevo, atualize ou baixe o mapa da região</string>
<string name="isolines_location_error_dialog">A camada Relevo ainda não está disponível para esta região</string>
<string name="elevation_profile_minaltitude">Altitude mínima</string>
<string name="elevation_profile_maxaltitude">Altitude máxima</string>
<string name="elevation_profile_min_elevation">Min. elevação</string>
<string name="elevation_profile_max_elevation">Máx. elevação</string>
<string name="elevation_profile_distance">Dist.:</string>
<string name="elevation_profile_time">Tempo:</string>
<string name="isolines_toast_zooms_1_10">Use o zoom para explorar as isolinhas</string>

View file

@ -741,8 +741,8 @@
<string name="isolines_location_error_dialog">A camada Terreno ainda não está disponível nesta área</string>
<string name="elevation_profile_ascent">Subida</string>
<string name="elevation_profile_descent">Descida</string>
<string name="elevation_profile_minaltitude">Altura mínima</string>
<string name="elevation_profile_maxaltitude">Altura máxima</string>
<string name="elevation_profile_min_elevation">Min. elevação</string>
<string name="elevation_profile_max_elevation">Máx. elevação</string>
<string name="elevation_profile_difficulty">Dificuldade</string>
<string name="elevation_profile_distance">Distância:</string>
<string name="elevation_profile_time">Tempo:</string>

View file

@ -751,8 +751,8 @@
<string name="isolines_location_error_dialog">Stratul topografic nu este încă disponibil în această zonă</string>
<string name="elevation_profile_ascent">Urcare</string>
<string name="elevation_profile_descent">Coborâre</string>
<string name="elevation_profile_minaltitude">Înălțime minimă</string>
<string name="elevation_profile_maxaltitude">Înălțime maximă</string>
<string name="elevation_profile_min_elevation">Min. altitudine</string>
<string name="elevation_profile_max_elevation">Max. altitudine</string>
<string name="elevation_profile_difficulty">Dificultate</string>
<string name="elevation_profile_distance">Dist.:</string>
<string name="elevation_profile_time">Timp:</string>

View file

@ -777,8 +777,8 @@
<string name="isolines_location_error_dialog">Линии высот пока не доступны в этом регионе</string>
<string name="elevation_profile_ascent">Подъём</string>
<string name="elevation_profile_descent">Спуск</string>
<string name="elevation_profile_minaltitude">Мин. высота</string>
<string name="elevation_profile_maxaltitude">Макс. высота</string>
<string name="elevation_profile_min_elevation">Мин. высота</string>
<string name="elevation_profile_max_elevation">Макс. высота</string>
<string name="elevation_profile_difficulty">Сложность</string>
<string name="elevation_profile_distance">Расст.:</string>
<string name="elevation_profile_time">В пути:</string>

View file

@ -763,8 +763,8 @@
<string name="isolines_location_error_dialog">Topografická vrstva ešte nie je v tejto oblasti k dispozícii</string>
<string name="elevation_profile_ascent">Stúpanie</string>
<string name="elevation_profile_descent">Klesanie</string>
<string name="elevation_profile_minaltitude">Min. nadmorská výška</string>
<string name="elevation_profile_maxaltitude">Max. nadmorská výška</string>
<string name="elevation_profile_min_elevation">Min. výška</string>
<string name="elevation_profile_max_elevation">Max. výška</string>
<string name="elevation_profile_difficulty">Obtiažnosť</string>
<string name="elevation_profile_distance">Vzdial.:</string>
<string name="elevation_profile_time">Čas:</string>

View file

@ -767,8 +767,6 @@
<string name="isolines_location_error_dialog">Изолиније нису доступне за ову област</string>
<string name="elevation_profile_ascent">Успон</string>
<string name="elevation_profile_descent">Спуст</string>
<string name="elevation_profile_minaltitude">Мин. висина</string>
<string name="elevation_profile_maxaltitude">Макс. висина</string>
<string name="elevation_profile_difficulty">Тежина</string>
<string name="elevation_profile_distance">Удаљ.:</string>
<string name="elevation_profile_time">Време:</string>

View file

@ -728,8 +728,8 @@
<string name="isolines_location_error_dialog">Höjningslinjer är ännu inte tillgängligt i den här regionen</string>
<string name="elevation_profile_ascent">Stigning</string>
<string name="elevation_profile_descent">Backe</string>
<string name="elevation_profile_minaltitude">Min. höjd</string>
<string name="elevation_profile_maxaltitude">Max. höjd</string>
<string name="elevation_profile_min_elevation">Min. höjd</string>
<string name="elevation_profile_max_elevation">Max. höjd</string>
<string name="elevation_profile_difficulty">Svårighet</string>
<string name="elevation_profile_distance">Avst.:</string>
<string name="elevation_profile_time">Tid:</string>

View file

@ -304,8 +304,8 @@
<string name="isolines_location_error_dialog">Tabaka la sura ya nchi bado haipatikani katika eneo hili</string>
<string name="elevation_profile_ascent">Upandaji</string>
<string name="elevation_profile_descent">Ushukaji</string>
<string name="elevation_profile_minaltitude">Mwinuko wa chini kabisa</string>
<string name="elevation_profile_maxaltitude">Mwinuko wa juu kabisa</string>
<string name="elevation_profile_min_elevation">Min. mwinuko</string>
<string name="elevation_profile_max_elevation">Max. mwinuko</string>
<string name="elevation_profile_difficulty">Ugumu</string>
<string name="elevation_profile_distance">Umbali:</string>
<string name="elevation_profile_time">Muda:</string>

View file

@ -731,8 +731,8 @@
<string name="isolines_location_error_dialog">เลเยอร์แผนที่ภูมิประเทศยังใช้งานไม่ได้ในพื้นที่นี้</string>
<string name="elevation_profile_ascent">การขึ้น</string>
<string name="elevation_profile_descent">การลง</string>
<string name="elevation_profile_minaltitude">ระดับความสูงต่ำสุด</string>
<string name="elevation_profile_maxaltitude">ระดับความสูงสูงสุด</string>
<string name="elevation_profile_min_elevation">ต่ำสุด</string>
<string name="elevation_profile_max_elevation">สูงสุด</string>
<string name="elevation_profile_difficulty">ลำบาก</string>
<string name="elevation_profile_distance">ระยะทาง</string>
<string name="elevation_profile_time">เวลา:</string>

View file

@ -766,8 +766,8 @@
<string name="isolines_location_error_dialog">Arazi katmanı henüz bu bölgede mevcut değil</string>
<string name="elevation_profile_ascent">Tırmanış</string>
<string name="elevation_profile_descent">İniş</string>
<string name="elevation_profile_minaltitude">Min. rakım</string>
<string name="elevation_profile_maxaltitude">Maks. rakım</string>
<string name="elevation_profile_min_elevation">Min. yükselti</string>
<string name="elevation_profile_max_elevation">Maks. yükselti</string>
<string name="elevation_profile_difficulty">Zorluk</string>
<string name="elevation_profile_distance">Mesafe:</string>
<string name="elevation_profile_time">Süre:</string>

View file

@ -772,8 +772,8 @@
<string name="isolines_location_error_dialog">Лінії висот ще недоступні в цьому регіоні</string>
<string name="elevation_profile_ascent">Підйом</string>
<string name="elevation_profile_descent">Спуск</string>
<string name="elevation_profile_minaltitude">Мін. висота</string>
<string name="elevation_profile_maxaltitude">Макс. висота</string>
<string name="elevation_profile_min_elevation">Мін. висота</string>
<string name="elevation_profile_max_elevation">Макс. висота</string>
<string name="elevation_profile_difficulty">Складність</string>
<string name="elevation_profile_distance">Відст.:</string>
<string name="elevation_profile_time">Шлях:</string>

View file

@ -729,8 +729,8 @@
<string name="isolines_location_error_dialog">Đường hiển thị độ cao hiện chưa khả dụng tại khu vực này</string>
<string name="elevation_profile_ascent">Đi lên</string>
<string name="elevation_profile_descent">Đi xuống</string>
<string name="elevation_profile_minaltitude">Độ cao tối thiểu</string>
<string name="elevation_profile_maxaltitude">Độ cao tối đa</string>
<string name="elevation_profile_min_elevation">Min. độ cao</string>
<string name="elevation_profile_max_elevation">Max. độ cao</string>
<string name="elevation_profile_difficulty">Độ khó</string>
<string name="elevation_profile_distance">Khoảng cách</string>
<string name="elevation_profile_time">Giờ:</string>

View file

@ -776,8 +776,8 @@
<string name="isolines_location_error_dialog">暫時無法獲取該地區的等高線</string>
<string name="elevation_profile_ascent">上坡</string>
<string name="elevation_profile_descent">下坡</string>
<string name="elevation_profile_minaltitude">最小高度</string>
<string name="elevation_profile_maxaltitude">最大高度</string>
<string name="elevation_profile_min_elevation">最低高度</string>
<string name="elevation_profile_max_elevation">最高高度</string>
<string name="elevation_profile_difficulty">難度</string>
<string name="elevation_profile_distance">距離:</string>
<string name="elevation_profile_time">時間:</string>

View file

@ -776,8 +776,8 @@
<string name="isolines_location_error_dialog">暂时无法获取该地区的等高线</string>
<string name="elevation_profile_ascent">上坡</string>
<string name="elevation_profile_descent">下坡</string>
<string name="elevation_profile_minaltitude">最小高度</string>
<string name="elevation_profile_maxaltitude">最大高度</string>
<string name="elevation_profile_min_elevation">最低高度</string>
<string name="elevation_profile_max_elevation">最高高度</string>
<string name="elevation_profile_difficulty">难度</string>
<string name="elevation_profile_distance">距离:</string>
<string name="elevation_profile_time">时间:</string>

View file

@ -796,8 +796,8 @@
<string name="isolines_location_error_dialog">Contour lines are not yet available in this area</string>
<string name="elevation_profile_ascent">Ascent</string>
<string name="elevation_profile_descent">Descent</string>
<string name="elevation_profile_minaltitude">Min. altitude</string>
<string name="elevation_profile_maxaltitude">Max. altitude</string>
<string name="elevation_profile_min_elevation">Min. elevation</string>
<string name="elevation_profile_max_elevation">Max. elevation</string>
<string name="elevation_profile_difficulty">Difficulty</string>
<string name="elevation_profile_distance">Dist.:</string>
<string name="elevation_profile_time">Time:</string>

View file

@ -29411,99 +29411,97 @@
zh-Hans = 下坡
zh-Hant = 下坡
[elevation_profile_minaltitude]
[elevation_profile_min_elevation]
tags = android,ios
en = Min. altitude
en = Min. elevation
af = Min. hoogte
ar = الحد الأدنى للارتفاع
ar = أقل ارتفاع
az = Min. hündürlük
be = Мін. вышыня
bg = Мин. надморска височина
ca = Altitud mín.
cs = Min. nadmořská výška
bg = Мин. височина
ca = Min. elevació
cs = Min. výška
da = Min. højde
de = Min. Höhe
el = Ελάχ. υψόμετρο
es = Altura mínima
es-MX = Altura mínima
es = Min. elevación
es-MX = Min. elevación
et = Min. kõrgus
eu = Gutxieneko altuera
fa = کمینه ارتفاع
eu = Min. altuera
fa = کم ارتفاع
fi = Min. korkeus
fr = Hauteur minimale
he = גובה מינימלי
fr = Min. élévation
he = מינ' גובה
hu = Min. magasság
id = Ketinggian Min.
it = Altitudine minima
ja = 最小高
ko = 최소 높이
lt = M. aukštis
id = Min. tinggi
it = Min. elevazione
ja = 最小
ko = 최소 높이
lt = Min. aukštis
lv = Zemākais punkts
mr = किमान उच्चता
mr = किमान उंची
nb = Min. høyde
nl = Min. hoogte
pl = Min. wysokość
pt = Altura mínima
pt-BR = Altitude mínima
ro = Înălțime minimă
pt = Min. elevação
pt-BR = Min. elevação
ro = Min. altitudine
ru = Мин. высота
sk = Min. nadmorská výška
sr = Мин. висина
sk = Min. výška
sv = Min. höjd
sw = Mwinuko wa chini kabisa
th = ระดับความสูงต่ำสุด
tr = Min. rakım
sw = Min. mwinuko
th = ต่ำสุด
tr = Min. yükselti
uk = Мін. висота
vi = Độ cao tối thiểu
zh-Hans = 最高度
zh-Hant = 最高度
vi = Min. độ cao
zh-Hans = 最高度
zh-Hant = 最高度
[elevation_profile_maxaltitude]
[elevation_profile_max_elevation]
tags = android,ios
en = Max. altitude
en = Max. elevation
af = Maks. hoogte
ar = الحد الأقصى للارتفاع
ar = أعلى ارتفاع
az = Maks. hündürlük
be = Макс. вышыня
bg = Макс. надморска височина
ca = Altitud màx.
cs = Max. nadmořská výška
bg = Макс. височина
ca = Màx. elevació
cs = Max. výška
da = Maks. højde
de = Max. Höhe
el = Μέγ. υψόμετρο
es = Altura máxima
es-MX = Altura máxima
es = Máx. elevación
es-MX = Máx. elevación
et = Maks. kõrgus
eu = Gehieneko altuera
fa = بیشینه ارتفاع
fi = Maks. korkeus
fr = Hauteur maximale
he = גובה מקסימלי
eu = Max. altuera
fa = بیش ارتفاع
fi = Max. korkeus
fr = Max. élévation
he = מקס' גובה
hu = Max. magasság
id = Ketinggian Maks.
it = Altitudine massima
ja = 最大高
ko = 최대 높이
id = Maks. tinggi
it = Max. elevazione
ja = 最大
ko = 최대 높이
lt = Didž. aukštis
lv = Augstākais punkts
mr = कमाल उच्चता
mr = कमाल उंची
nb = Maks. høyde
nl = Max. hoogte
pl = Maks. wysokość
pt = Altura máxima
pt-BR = Altitude máxima
ro = Înălțime maximă
pt = Máx. elevação
pt-BR = Máx. elevação
ro = Max. altitudine
ru = Макс. высота
sk = Max. nadmorská výška
sr = Макс. висина
sk = Max. výška
sv = Max. höjd
sw = Mwinuko wa juu kabisa
th = ระดับความสูงสูงสุด
tr = Maks. rakım
sw = Max. mwinuko
th = สูงสุด
tr = Maks. yükselti
uk = Макс. висота
vi = Độ cao tối đa
zh-Hans = 最高度
zh-Hant = 最高度
vi = Max. độ cao
zh-Hans = 最高度
zh-Hant = 最高度
[elevation_profile_difficulty]
tags = android,ios

View file

@ -32,7 +32,7 @@ static inline BOOL isIOSVersionLessThan(NSUInteger version)
return isIOSVersionLessThanString([NSString stringWithFormat:@"%@", @(version)]);
}
static inline BOOL isInterfaceRightToLeft(void)
static inline BOOL isInterfaceRightToLeft(void) NS_EXTENSION_UNAVAILABLE_IOS("Not available in extensions")
{
return UIApplication.sharedApplication.userInterfaceLayoutDirection ==
UIUserInterfaceLayoutDirectionRightToLeft;
@ -50,7 +50,7 @@ static inline BOOL equalScreenDimensions(CGFloat left, CGFloat right)
return fabs(left - right) < 0.5;
}
static inline CGFloat statusBarHeight(void)
static inline CGFloat statusBarHeight(void) NS_EXTENSION_UNAVAILABLE_IOS("Not available in extensions")
{
CGSize const statusBarSize = UIApplication.sharedApplication.statusBarFrame.size;
return MIN(statusBarSize.height, statusBarSize.width);

View file

@ -11,6 +11,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) NSString * maxElevation;
@property (nonatomic, readonly) NSString * minElevation;
+ (TrackRecordingInfo *)emptyInfo;
@end
NS_ASSUME_NONNULL_END

View file

@ -5,6 +5,10 @@
@implementation TrackRecordingInfo
+ (TrackRecordingInfo *)emptyInfo {
return [[TrackRecordingInfo alloc] initWithGpsTrackInfo:GpsTrackInfo()];
}
@end
@implementation TrackRecordingInfo (Core)

View file

@ -136,7 +136,7 @@ final class TrackRecordingViewController: MWMViewController {
@objc
private func onTrackRecordingButtonPressed(_ sender: Any) {
switch trackRecordingManager.recordingState {
case .inactive, .error:
case .inactive:
trackRecordingManager.processAction(.start)
case .active:
trackRecordingManager.processAction(.stop)

View file

@ -101,6 +101,7 @@ using namespace osm_auth_ios;
NSTimeInterval const minimumBackgroundFetchIntervalInSeconds = 6 * 60 * 60;
[UIApplication.sharedApplication setMinimumBackgroundFetchInterval:minimumBackgroundFetchIntervalInSeconds];
[self updateApplicationIconBadgeNumber];
[TrackRecordingManager.shared setup];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

View file

@ -0,0 +1,60 @@
import ActivityKit
#if canImport(ActivityKit)
protocol TrackRecordingActivityManager {
func start(with info: TrackRecordingInfo) throws
func update(_ info: TrackRecordingInfo)
func stop()
}
@available(iOS 16.2, *)
final class TrackRecordingLiveActivityManager {
static let shared = TrackRecordingLiveActivityManager()
private var activity: Activity<TrackRecordingLiveActivityAttributes>?
private init() {}
}
// MARK: - TrackRecordingActivityManager
@available(iOS 16.2, *)
extension TrackRecordingLiveActivityManager: TrackRecordingActivityManager {
func start(with info: TrackRecordingInfo) throws {
guard activity == nil else { return }
let state = TrackRecordingLiveActivityAttributes.ContentState(trackInfo: info)
let content = ActivityContent<TrackRecordingLiveActivityAttributes.ContentState>(state: state, staleDate: nil)
let attributes = TrackRecordingLiveActivityAttributes()
activity = try LiveActivityManager.startActivity(attributes, content: content)
}
func update(_ info: TrackRecordingInfo) {
guard let activity else { return }
let state = TrackRecordingLiveActivityAttributes.ContentState(trackInfo: info)
let content = ActivityContent<TrackRecordingLiveActivityAttributes.ContentState>(state: state, staleDate: nil)
LiveActivityManager.update(activity, content: content)
}
func stop() {
guard let activity else { return }
LiveActivityManager.stop(activity)
self.activity = nil
}
}
// MARK: - Wrap TrackRecordingInfo to TrackRecordingLiveActivityAttributes.ContentState
private extension TrackRecordingLiveActivityAttributes.ContentState {
init(trackInfo: TrackRecordingInfo) {
self.distance = StatisticsViewModel(key: "", value: trackInfo.distance)
self.duration = StatisticsViewModel(key: "", value: trackInfo.duration)
self.maxElevation = StatisticsViewModel(key: L("elevation_profile_max_elevation"), value: trackInfo.maxElevation)
self.minElevation = StatisticsViewModel(key: L("elevation_profile_min_elevation"), value: trackInfo.minElevation)
self.ascent = StatisticsViewModel(key: L("elevation_profile_ascent"), value: trackInfo.ascent)
self.descent = StatisticsViewModel(key: L("elevation_profile_descent"), value: trackInfo.descent)
}
}
#endif

View file

@ -1,10 +1,9 @@
enum TrackRecordingState: Equatable {
case inactive
case active
case error(TrackRecordingError)
}
enum TrackRecordingAction {
enum TrackRecordingAction: String, CaseIterable {
case start
case stop
}
@ -13,6 +12,11 @@ enum TrackRecordingError: Error {
case locationIsProhibited
}
protocol TrackRecordingObserver: AnyObject {
func addObserver(_ observer: AnyObject, recordingIsActiveDidChangeHandler: @escaping TrackRecordingStateHandler)
func removeObserver(_ observer: AnyObject)
}
typealias TrackRecordingStateHandler = (Bool) -> Void
@objcMembers
@ -30,20 +34,48 @@ final class TrackRecordingManager: NSObject {
var recordingStateDidChangeHandler: TrackRecordingStateHandler?
}
static let shared: TrackRecordingManager = TrackRecordingManager(trackRecorder: FrameworkHelper.self)
static let shared: TrackRecordingManager = {
let trackRecorder = FrameworkHelper.self
var activityManager: TrackRecordingActivityManager? = nil
#if canImport(ActivityKit)
if #available(iOS 16.2, *) {
activityManager = TrackRecordingLiveActivityManager.shared
}
#endif
return TrackRecordingManager(trackRecorder: trackRecorder, activityManager: activityManager)
}()
private let trackRecorder: TrackRecorder.Type
private var activityManager: TrackRecordingActivityManager?
private var observations: [Observation] = []
private(set) var recordingState: TrackRecordingState = .inactive {
didSet {
notifyObservers()
}
private var trackRecordingInfo: TrackRecordingInfo?
var recordingState: TrackRecordingState {
trackRecorder.isTrackRecordingEnabled() ? .active : .inactive
}
private init(trackRecorder: TrackRecorder.Type) {
private init(trackRecorder: TrackRecorder.Type, activityManager: TrackRecordingActivityManager?) {
self.trackRecorder = trackRecorder
self.activityManager = activityManager
super.init()
self.recordingState = getCurrentRecordingState()
subscribeOnAppLifecycleEvents()
}
// MARK: - Public methods
@objc
func setup() {
do {
try checkIsLocationEnabled()
switch recordingState {
case .inactive:
break
case .active:
subscribeOnTrackRecordingProgressUpdates()
}
} catch {
handleError(error)
}
}
@objc
@ -60,50 +92,73 @@ final class TrackRecordingManager: NSObject {
}
}
@objc
func addObserver(_ observer: AnyObject, recordingIsActiveDidChangeHandler: @escaping TrackRecordingStateHandler) {
let observation = Observation(observer: observer, recordingStateDidChangeHandler: recordingIsActiveDidChangeHandler)
observations.append(observation)
recordingIsActiveDidChangeHandler(recordingState == .active)
}
// MARK: - Private methods
@objc
func removeObserver(_ observer: AnyObject) {
observations.removeAll { $0.observer === observer }
}
private func notifyObservers() {
observations = observations.filter { $0.observer != nil }
observations.forEach { $0.recordingStateDidChangeHandler?(recordingState == .active) }
}
private func handleError(_ error: TrackRecordingError, completion: (CompletionHandler)? = nil) {
switch error {
case .locationIsProhibited:
// Show alert to enable location
LocationManager.checkLocationStatus()
}
stopRecording(.withoutSaving, completion: completion)
}
private func getCurrentRecordingState() -> TrackRecordingState {
private func checkIsLocationEnabled() throws {
guard !LocationManager.isLocationProhibited() else {
return .error(.locationIsProhibited)
throw TrackRecordingError.locationIsProhibited
}
return trackRecorder.isTrackRecordingEnabled() ? .active : .inactive
}
// MARK: - Handle lifecycle events
private func subscribeOnAppLifecycleEvents() {
NotificationCenter.default.addObserver(self, selector: #selector(willResignActive), name: UIApplication.willResignActiveNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(prepareForTermination), name: UIApplication.willTerminateNotification, object: nil)
}
@objc
private func willResignActive() {
guard let activityManager, recordingState == .active else { return }
do {
try activityManager.start(with: trackRecordingInfo ?? .empty())
} catch {
handleError(error)
}
}
@objc
private func willEnterForeground() {
activityManager?.stop()
}
@objc
private func prepareForTermination() {
activityManager?.stop()
}
// MARK: - Handle track recording process
private func subscribeOnTrackRecordingProgressUpdates() {
trackRecorder.setTrackRecordingUpdateHandler { [weak self] info in
guard let self else { return }
self.trackRecordingInfo = info
self.activityManager?.update(info)
}
}
private func unsubscribeFromTrackRecordingProgressUpdates() {
trackRecorder.setTrackRecordingUpdateHandler(nil)
trackRecordingInfo = nil
}
// MARK: - Handle Start/Stop event and Errors
private func start(completion: (CompletionHandler)? = nil) {
let state = getCurrentRecordingState()
switch state {
case .inactive:
trackRecorder.startTrackRecording()
recordingState = .active
do {
try checkIsLocationEnabled()
switch recordingState {
case .inactive:
subscribeOnTrackRecordingProgressUpdates()
trackRecorder.startTrackRecording()
notifyObservers()
case .active:
break
}
completion?()
case .active:
completion?()
case .error(let trackRecordingError):
handleError(trackRecordingError, completion: completion)
} catch {
handleError(error, completion: completion)
}
}
@ -128,18 +183,32 @@ final class TrackRecordingManager: NSObject {
}
private func stopRecording(_ savingOption: SavingOption, completion: (CompletionHandler)? = nil) {
unsubscribeFromTrackRecordingProgressUpdates()
trackRecorder.stopTrackRecording()
activityManager?.stop()
notifyObservers()
switch savingOption {
case .withoutSaving:
break
case .saveWithName(let name):
trackRecorder.saveTrackRecording(withName: name)
}
recordingState = .inactive
completion?()
}
private static func showOnFinishRecordingAlert(onSave: @escaping CompletionHandler,
private func handleError(_ error: Error, completion: (CompletionHandler)? = nil) {
LOG(.error, error.localizedDescription)
switch error {
case TrackRecordingError.locationIsProhibited:
// Show alert to enable location
LocationManager.checkLocationStatus()
default:
break
}
stopRecording(.withoutSaving, completion: completion)
}
private static func showOnFinishRecordingAlert(onSave: @escaping CompletionHandler,
onStop: @escaping CompletionHandler,
onContinue: @escaping CompletionHandler) {
let alert = UIAlertController(title: L("track_recording_alert_title"), message: nil, preferredStyle: .alert)
@ -149,3 +218,24 @@ final class TrackRecordingManager: NSObject {
UIViewController.topViewController().present(alert, animated: true)
}
}
// MARK: - TrackRecordingObserver
extension TrackRecordingManager: TrackRecordingObserver {
@objc
func addObserver(_ observer: AnyObject, recordingIsActiveDidChangeHandler: @escaping TrackRecordingStateHandler) {
let observation = Observation(observer: observer, recordingStateDidChangeHandler: recordingIsActiveDidChangeHandler)
observations.append(observation)
recordingIsActiveDidChangeHandler(recordingState == .active)
}
@objc
func removeObserver(_ observer: AnyObject) {
observations.removeAll { $0.observer === observer }
}
private func notifyObservers() {
observations = observations.filter { $0.observer != nil }
observations.forEach { $0.recordingStateDidChangeHandler?(recordingState == .active) }
}
}

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "تنازلي";
"elevation_profile_minaltitude" = "الحد الأدنى للارتفاع";
"elevation_profile_min_elevation" = "أقل ارتفاع";
"elevation_profile_maxaltitude" = "الحد الأقصى للارتفاع";
"elevation_profile_max_elevation" = "أعلى ارتفاع";
"elevation_profile_difficulty" = "درجة الصعوبة";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Eniş";
"elevation_profile_minaltitude" = "Min. hündürlük";
"elevation_profile_min_elevation" = "Min. hündürlük";
"elevation_profile_maxaltitude" = "Maks. hündürlük";
"elevation_profile_max_elevation" = "Maks. hündürlük";
"elevation_profile_difficulty" = "Çətinlik";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Спуск";
"elevation_profile_minaltitude" = "Мін. вышыня";
"elevation_profile_min_elevation" = "Мін. вышыня";
"elevation_profile_maxaltitude" = "Макс. вышыня";
"elevation_profile_max_elevation" = "Макс. вышыня";
"elevation_profile_difficulty" = "Складанасць";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Спускане";
"elevation_profile_minaltitude" = "Мин. надморска височина";
"elevation_profile_min_elevation" = "Мин. височина";
"elevation_profile_maxaltitude" = "Макс. надморска височина";
"elevation_profile_max_elevation" = "Макс. височина";
"elevation_profile_difficulty" = "Трудност";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descens";
"elevation_profile_minaltitude" = "Altitud mín.";
"elevation_profile_min_elevation" = "Min. elevació";
"elevation_profile_maxaltitude" = "Altitud màx.";
"elevation_profile_max_elevation" = "Màx. elevació";
"elevation_profile_difficulty" = "Dificultat";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Klesání";
"elevation_profile_minaltitude" = "Min. nadmořská výška";
"elevation_profile_min_elevation" = "Min. výška";
"elevation_profile_maxaltitude" = "Max. nadmořská výška";
"elevation_profile_max_elevation" = "Max. výška";
"elevation_profile_difficulty" = "Obtížnost";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Stige ned";
"elevation_profile_minaltitude" = "Min. højde";
"elevation_profile_min_elevation" = "Min. højde";
"elevation_profile_maxaltitude" = "Maks. højde";
"elevation_profile_max_elevation" = "Maks. højde";
"elevation_profile_difficulty" = "Vanskelighed";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Bergab";
"elevation_profile_minaltitude" = "Min. Höhe";
"elevation_profile_min_elevation" = "Min. Höhe";
"elevation_profile_maxaltitude" = "Max. Höhe";
"elevation_profile_max_elevation" = "Max. Höhe";
"elevation_profile_difficulty" = "Schwierigkeitsgrad";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Κατάβαση";
"elevation_profile_minaltitude" = "Ελάχ. υψόμετρο";
"elevation_profile_min_elevation" = "Ελάχ. υψόμετρο";
"elevation_profile_maxaltitude" = "Μέγ. υψόμετρο";
"elevation_profile_max_elevation" = "Μέγ. υψόμετρο";
"elevation_profile_difficulty" = "Δυσκολία";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descent";
"elevation_profile_minaltitude" = "Min. altitude";
"elevation_profile_min_elevation" = "Min. elevation";
"elevation_profile_maxaltitude" = "Max. altitude";
"elevation_profile_max_elevation" = "Max. elevation";
"elevation_profile_difficulty" = "Difficulty";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descent";
"elevation_profile_minaltitude" = "Min. altitude";
"elevation_profile_min_elevation" = "Min. elevation";
"elevation_profile_maxaltitude" = "Max. altitude";
"elevation_profile_max_elevation" = "Max. elevation";
"elevation_profile_difficulty" = "Difficulty";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descenso";
"elevation_profile_minaltitude" = "Altura mínima";
"elevation_profile_min_elevation" = "Min. elevación";
"elevation_profile_maxaltitude" = "Altura máxima";
"elevation_profile_max_elevation" = "Máx. elevación";
"elevation_profile_difficulty" = "Dificultad";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descenso";
"elevation_profile_minaltitude" = "Altura mínima";
"elevation_profile_min_elevation" = "Min. elevación";
"elevation_profile_maxaltitude" = "Altura máxima";
"elevation_profile_max_elevation" = "Máx. elevación";
"elevation_profile_difficulty" = "Dificultad";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Langus";
"elevation_profile_minaltitude" = "Min. kõrgus";
"elevation_profile_min_elevation" = "Min. kõrgus";
"elevation_profile_maxaltitude" = "Maks. kõrgus";
"elevation_profile_max_elevation" = "Maks. kõrgus";
"elevation_profile_difficulty" = "Raskusaste";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Maldan behera";
"elevation_profile_minaltitude" = "Gutxieneko altuera";
"elevation_profile_min_elevation" = "Min. altuera";
"elevation_profile_maxaltitude" = "Gehieneko altuera";
"elevation_profile_max_elevation" = "Max. altuera";
"elevation_profile_difficulty" = "Zailtasuna";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "پایین آمدن";
"elevation_profile_minaltitude" = "کمینه ارتفاع";
"elevation_profile_min_elevation" = "کم ارتفاع";
"elevation_profile_maxaltitude" = "بیشینه ارتفاع";
"elevation_profile_max_elevation" = "بیش ارتفاع";
"elevation_profile_difficulty" = "دشواری";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Laskua";
"elevation_profile_minaltitude" = "Min. korkeus";
"elevation_profile_min_elevation" = "Min. korkeus";
"elevation_profile_maxaltitude" = "Maks. korkeus";
"elevation_profile_max_elevation" = "Max. korkeus";
"elevation_profile_difficulty" = "Vaikeus";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descente";
"elevation_profile_minaltitude" = "Hauteur minimale";
"elevation_profile_min_elevation" = "Min. élévation";
"elevation_profile_maxaltitude" = "Hauteur maximale";
"elevation_profile_max_elevation" = "Max. élévation";
"elevation_profile_difficulty" = "Difficulté";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "ירידה";
"elevation_profile_minaltitude" = "גובה מינימלי";
"elevation_profile_min_elevation" = "מינ' גובה";
"elevation_profile_maxaltitude" = "גובה מקסימלי";
"elevation_profile_max_elevation" = "מקס' גובה";
"elevation_profile_difficulty" = "קושי";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descent";
"elevation_profile_minaltitude" = "Min. altitude";
"elevation_profile_min_elevation" = "Min. elevation";
"elevation_profile_maxaltitude" = "Max. altitude";
"elevation_profile_max_elevation" = "Max. elevation";
"elevation_profile_difficulty" = "Difficulty";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Leereszkedés";
"elevation_profile_minaltitude" = "Min. magasság";
"elevation_profile_min_elevation" = "Min. magasság";
"elevation_profile_maxaltitude" = "Max. magasság";
"elevation_profile_max_elevation" = "Max. magasság";
"elevation_profile_difficulty" = "Nehézség";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Menurun";
"elevation_profile_minaltitude" = "Ketinggian Min.";
"elevation_profile_min_elevation" = "Min. tinggi";
"elevation_profile_maxaltitude" = "Ketinggian Maks.";
"elevation_profile_max_elevation" = "Maks. tinggi";
"elevation_profile_difficulty" = "Kesulitan";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Discesa";
"elevation_profile_minaltitude" = "Altitudine minima";
"elevation_profile_min_elevation" = "Min. elevazione";
"elevation_profile_maxaltitude" = "Altitudine massima";
"elevation_profile_max_elevation" = "Max. elevazione";
"elevation_profile_difficulty" = "Difficoltà";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "下降";
"elevation_profile_minaltitude" = "最小高度";
"elevation_profile_min_elevation" = "最小標高";
"elevation_profile_maxaltitude" = "最大高度";
"elevation_profile_max_elevation" = "最大標高";
"elevation_profile_difficulty" = "難易度";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "내려가기";
"elevation_profile_minaltitude" = "산 최소 높이";
"elevation_profile_min_elevation" = "최소 높이";
"elevation_profile_maxaltitude" = "산 최대 높이";
"elevation_profile_max_elevation" = "최대 높이";
"elevation_profile_difficulty" = "난이도";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Kritums";
"elevation_profile_minaltitude" = "Zemākais punkts";
"elevation_profile_min_elevation" = "Zemākais punkts";
"elevation_profile_maxaltitude" = "Augstākais punkts";
"elevation_profile_max_elevation" = "Augstākais punkts";
"elevation_profile_difficulty" = "Sarežģītība";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "उतरण";
"elevation_profile_minaltitude" = "किमान उच्चता";
"elevation_profile_min_elevation" = "किमान उंची";
"elevation_profile_maxaltitude" = "कमाल उच्चता";
"elevation_profile_max_elevation" = "कमाल उंची";
"elevation_profile_difficulty" = "काठिण्य";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Nedstigning";
"elevation_profile_minaltitude" = "Min. høyde";
"elevation_profile_min_elevation" = "Min. høyde";
"elevation_profile_maxaltitude" = "Maks. høyde";
"elevation_profile_max_elevation" = "Maks. høyde";
"elevation_profile_difficulty" = "Vanskelighet";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Daling";
"elevation_profile_minaltitude" = "Min. hoogte";
"elevation_profile_min_elevation" = "Min. hoogte";
"elevation_profile_maxaltitude" = "Max. hoogte";
"elevation_profile_max_elevation" = "Max. hoogte";
"elevation_profile_difficulty" = "Moeilijkheid";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Zejście";
"elevation_profile_minaltitude" = "Min. wysokość";
"elevation_profile_min_elevation" = "Min. wysokość";
"elevation_profile_maxaltitude" = "Maks. wysokość";
"elevation_profile_max_elevation" = "Maks. wysokość";
"elevation_profile_difficulty" = "Trudność";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descida";
"elevation_profile_minaltitude" = "Altitude mínima";
"elevation_profile_min_elevation" = "Min. elevação";
"elevation_profile_maxaltitude" = "Altitude máxima";
"elevation_profile_max_elevation" = "Máx. elevação";
"elevation_profile_difficulty" = "Dificuldade";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Descida";
"elevation_profile_minaltitude" = "Altura mínima";
"elevation_profile_min_elevation" = "Min. elevação";
"elevation_profile_maxaltitude" = "Altura máxima";
"elevation_profile_max_elevation" = "Máx. elevação";
"elevation_profile_difficulty" = "Dificuldade";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Coborâre";
"elevation_profile_minaltitude" = "Înălțime minimă";
"elevation_profile_min_elevation" = "Min. altitudine";
"elevation_profile_maxaltitude" = "Înălțime maximă";
"elevation_profile_max_elevation" = "Max. altitudine";
"elevation_profile_difficulty" = "Dificultate";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Спуск";
"elevation_profile_minaltitude" = "Мин. высота";
"elevation_profile_min_elevation" = "Мин. высота";
"elevation_profile_maxaltitude" = "Макс. высота";
"elevation_profile_max_elevation" = "Макс. высота";
"elevation_profile_difficulty" = "Сложность";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Klesanie";
"elevation_profile_minaltitude" = "Min. nadmorská výška";
"elevation_profile_min_elevation" = "Min. výška";
"elevation_profile_maxaltitude" = "Max. nadmorská výška";
"elevation_profile_max_elevation" = "Max. výška";
"elevation_profile_difficulty" = "Obtiažnosť";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Спуст";
"elevation_profile_minaltitude" = "Мин. висина";
"elevation_profile_min_elevation" = "Min. elevation";
"elevation_profile_maxaltitude" = "Макс. висина";
"elevation_profile_max_elevation" = "Max. elevation";
"elevation_profile_difficulty" = "Тежина";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Backe";
"elevation_profile_minaltitude" = "Min. höjd";
"elevation_profile_min_elevation" = "Min. höjd";
"elevation_profile_maxaltitude" = "Max. höjd";
"elevation_profile_max_elevation" = "Max. höjd";
"elevation_profile_difficulty" = "Svårighet";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Ushukaji";
"elevation_profile_minaltitude" = "Mwinuko wa chini kabisa";
"elevation_profile_min_elevation" = "Min. mwinuko";
"elevation_profile_maxaltitude" = "Mwinuko wa juu kabisa";
"elevation_profile_max_elevation" = "Max. mwinuko";
"elevation_profile_difficulty" = "Ugumu";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "การลง";
"elevation_profile_minaltitude" = "ระดับความสูงต่ำสุด";
"elevation_profile_min_elevation" = "ต่ำสุด";
"elevation_profile_maxaltitude" = "ระดับความสูงสูงสุด";
"elevation_profile_max_elevation" = "สูงสุด";
"elevation_profile_difficulty" = "ลำบาก";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "İniş";
"elevation_profile_minaltitude" = "Min. rakım";
"elevation_profile_min_elevation" = "Min. yükselti";
"elevation_profile_maxaltitude" = "Maks. rakım";
"elevation_profile_max_elevation" = "Maks. yükselti";
"elevation_profile_difficulty" = "Zorluk";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Спуск";
"elevation_profile_minaltitude" = "Мін. висота";
"elevation_profile_min_elevation" = "Мін. висота";
"elevation_profile_maxaltitude" = "Макс. висота";
"elevation_profile_max_elevation" = "Макс. висота";
"elevation_profile_difficulty" = "Складність";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "Đi xuống";
"elevation_profile_minaltitude" = "Độ cao tối thiểu";
"elevation_profile_min_elevation" = "Min. độ cao";
"elevation_profile_maxaltitude" = "Độ cao tối đa";
"elevation_profile_max_elevation" = "Max. độ cao";
"elevation_profile_difficulty" = "Độ khó";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "下坡";
"elevation_profile_minaltitude" = "最小高度";
"elevation_profile_min_elevation" = "最低高度";
"elevation_profile_maxaltitude" = "最大高度";
"elevation_profile_max_elevation" = "最高高度";
"elevation_profile_difficulty" = "难度";

View file

@ -1228,9 +1228,9 @@
"elevation_profile_descent" = "下坡";
"elevation_profile_minaltitude" = "最小高度";
"elevation_profile_min_elevation" = "最低高度";
"elevation_profile_maxaltitude" = "最大高度";
"elevation_profile_max_elevation" = "最高高度";
"elevation_profile_difficulty" = "難度";

View file

@ -475,10 +475,25 @@
ED1080A72B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED1080A62B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift */; };
ED1263AB2B6F99F900AD99F3 /* UIView+AddSeparator.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED1263AA2B6F99F900AD99F3 /* UIView+AddSeparator.swift */; };
ED1ADA332BC6B1B40029209F /* CarPlayServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED1ADA322BC6B1B40029209F /* CarPlayServiceTests.swift */; };
ED2D74382D14337500660FBF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ED2D74342D14337500660FBF /* Assets.xcassets */; };
ED2D743A2D14337500660FBF /* AppLogo.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742C2D14337500660FBF /* AppLogo.swift */; };
ED2D743B2D14337500660FBF /* LiveActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742D2D14337500660FBF /* LiveActivityManager.swift */; };
ED2D743C2D14337500660FBF /* StatisticDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742E2D14337500660FBF /* StatisticDetailView.swift */; };
ED2D743D2D14337500660FBF /* StatisticValueView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742F2D14337500660FBF /* StatisticValueView.swift */; };
ED2D743E2D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74302D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift */; };
ED2D743F2D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74312D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift */; };
ED2D74402D14337500660FBF /* TrackRecordingLiveActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74322D14337500660FBF /* TrackRecordingLiveActivityView.swift */; };
ED2D74412D14337500660FBF /* OMapsWidgetExtensionBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74362D14337500660FBF /* OMapsWidgetExtensionBundle.swift */; };
ED2D745E2D1433DE00660FBF /* TrackRecordingActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D745D2D1433DE00660FBF /* TrackRecordingActivityManager.swift */; };
ED2D74652D14357F00660FBF /* TrackRecordingLiveActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D74302D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift */; };
ED2D74662D1435A600660FBF /* LiveActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742D2D14337500660FBF /* LiveActivityManager.swift */; };
ED2E328E2D10500900807A08 /* TrackRecordingButtonArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED46DD922D06F804007CACD6 /* TrackRecordingButtonArea.swift */; };
ED2E32912D10501700807A08 /* TrackRecordingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED49D76F2CF0E3A8004AF27E /* TrackRecordingViewController.swift */; };
ED3EAC202B03C88100220A4A /* BottomTabBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED3EAC1F2B03C88100220A4A /* BottomTabBarButton.swift */; };
ED43B8BD2C12063500D07BAA /* DocumentPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED43B8BC2C12063500D07BAA /* DocumentPicker.swift */; };
ED46DDCE2D098A0B007CACD6 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46DDCD2D098A0B007CACD6 /* WidgetKit.framework */; };
ED46DDD02D098A0B007CACD6 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46DDCF2D098A0B007CACD6 /* SwiftUI.framework */; };
ED46DDE12D098A0C007CACD6 /* OMapsWidgetExtensionExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = ED46DDCC2D098A0B007CACD6 /* OMapsWidgetExtensionExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
ED4DC7772CAEDECC0029B338 /* ProductsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED4DC7752CAEDECC0029B338 /* ProductsViewModel.swift */; };
ED4DC7782CAEDECC0029B338 /* ProductButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED4DC7732CAEDECC0029B338 /* ProductButton.swift */; };
ED4DC7792CAEDECC0029B338 /* ProductsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED4DC7742CAEDECC0029B338 /* ProductsViewController.swift */; };
@ -694,6 +709,13 @@
remoteGlobalIDString = 6741A93D1BF340DE002C974C;
remoteInfo = OMaps;
};
ED46DDDF2D098A0C007CACD6 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
proxyType = 1;
remoteGlobalIDString = ED46DDCB2D098A0B007CACD6;
remoteInfo = OMapsWidgetExtensionExtension;
};
FA456C4626BDCC8E00B83C20 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FA456C4026BDCC8E00B83C20 /* shaders.xcodeproj */;
@ -738,6 +760,17 @@
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
ED46DDE22D098A0C007CACD6 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
ED46DDE12D098A0C007CACD6 /* OMapsWidgetExtensionExtension.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
FA456C4E26BDCCC300B83C20 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@ -1406,9 +1439,23 @@
ED1080A62B791CFE0023F27E /* SocialMediaCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialMediaCollectionViewHeader.swift; sourceTree = "<group>"; };
ED1263AA2B6F99F900AD99F3 /* UIView+AddSeparator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+AddSeparator.swift"; sourceTree = "<group>"; };
ED1ADA322BC6B1B40029209F /* CarPlayServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarPlayServiceTests.swift; sourceTree = "<group>"; };
ED2D742C2D14337500660FBF /* AppLogo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLogo.swift; sourceTree = "<group>"; };
ED2D742D2D14337500660FBF /* LiveActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveActivityManager.swift; sourceTree = "<group>"; };
ED2D742E2D14337500660FBF /* StatisticDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatisticDetailView.swift; sourceTree = "<group>"; };
ED2D742F2D14337500660FBF /* StatisticValueView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatisticValueView.swift; sourceTree = "<group>"; };
ED2D74302D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingLiveActivityAttributes.swift; sourceTree = "<group>"; };
ED2D74312D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingLiveActivityConfiguration.swift; sourceTree = "<group>"; };
ED2D74322D14337500660FBF /* TrackRecordingLiveActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingLiveActivityView.swift; sourceTree = "<group>"; };
ED2D74342D14337500660FBF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
ED2D74352D14337500660FBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
ED2D74362D14337500660FBF /* OMapsWidgetExtensionBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OMapsWidgetExtensionBundle.swift; sourceTree = "<group>"; };
ED2D745D2D1433DE00660FBF /* TrackRecordingActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingActivityManager.swift; sourceTree = "<group>"; };
ED3EAC1F2B03C88100220A4A /* BottomTabBarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarButton.swift; sourceTree = "<group>"; };
ED43B8BC2C12063500D07BAA /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = "<group>"; };
ED46DD922D06F804007CACD6 /* TrackRecordingButtonArea.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingButtonArea.swift; sourceTree = "<group>"; };
ED46DDCC2D098A0B007CACD6 /* OMapsWidgetExtensionExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OMapsWidgetExtensionExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
ED46DDCD2D098A0B007CACD6 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
ED46DDCF2D098A0B007CACD6 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
ED48BBB817C2B1E2003E7E92 /* CircleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CircleView.h; sourceTree = "<group>"; };
ED48BBB917C2B1E2003E7E92 /* CircleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CircleView.m; sourceTree = "<group>"; };
ED49D76F2CF0E3A8004AF27E /* TrackRecordingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingViewController.swift; sourceTree = "<group>"; };
@ -1823,6 +1870,15 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
ED46DDC92D098A0B007CACD6 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
ED46DDD02D098A0B007CACD6 /* SwiftUI.framework in Frameworks */,
ED46DDCE2D098A0B007CACD6 /* WidgetKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@ -1864,6 +1920,7 @@
children = (
6741AA5D1BF340DE002C974C /* Organic Maps (Debug).app */,
ED097E762BB80C320006ED01 /* OMapsTests.xctest */,
ED46DDCC2D098A0B007CACD6 /* OMapsWidgetExtensionExtension.appex */,
);
name = Products;
sourceTree = "<group>";
@ -1890,6 +1947,7 @@
29B97317FDCFA39411CA2CEA /* Resources */,
F6E2FBFB1E097B9F0083EBEC /* UI */,
ED1ADA312BC6B19E0029209F /* Tests */,
ED2D74372D14337500660FBF /* OMapsWidgetExtension */,
);
indentWidth = 2;
name = Maps;
@ -1958,6 +2016,8 @@
FA853BD026BC3B8A0026D455 /* libsuccinct.a */,
FA853BA626BC3ACE0026D455 /* CoreApi.framework */,
FA14E683276014C10066E453 /* libz.1.tbd */,
ED46DDCD2D098A0B007CACD6 /* WidgetKit.framework */,
ED46DDCF2D098A0B007CACD6 /* SwiftUI.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@ -3109,6 +3169,7 @@
ED0C54942C6E14CB00253A5F /* TrackRecorder */ = {
isa = PBXGroup;
children = (
ED2D745D2D1433DE00660FBF /* TrackRecordingActivityManager.swift */,
ED0C54972C6E14E800253A5F /* TrackRecordingManager.swift */,
);
path = TrackRecorder;
@ -3124,6 +3185,31 @@
path = Tests;
sourceTree = "<group>";
};
ED2D74332D14337500660FBF /* LiveActivity */ = {
isa = PBXGroup;
children = (
ED2D742C2D14337500660FBF /* AppLogo.swift */,
ED2D742D2D14337500660FBF /* LiveActivityManager.swift */,
ED2D742E2D14337500660FBF /* StatisticDetailView.swift */,
ED2D742F2D14337500660FBF /* StatisticValueView.swift */,
ED2D74302D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift */,
ED2D74312D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift */,
ED2D74322D14337500660FBF /* TrackRecordingLiveActivityView.swift */,
);
path = LiveActivity;
sourceTree = "<group>";
};
ED2D74372D14337500660FBF /* OMapsWidgetExtension */ = {
isa = PBXGroup;
children = (
ED2D74332D14337500660FBF /* LiveActivity */,
ED2D74342D14337500660FBF /* Assets.xcassets */,
ED2D74352D14337500660FBF /* Info.plist */,
ED2D74362D14337500660FBF /* OMapsWidgetExtensionBundle.swift */,
);
path = OMapsWidgetExtension;
sourceTree = "<group>";
};
ED43B8B92C12061600D07BAA /* DocumentPicker */ = {
isa = PBXGroup;
children = (
@ -3972,11 +4058,13 @@
6741A9A01BF340DE002C974C /* Sources */,
6741AA311BF340DE002C974C /* Frameworks */,
4740184523F5BDE900A93C81 /* Embed Frameworks */,
ED46DDE22D098A0C007CACD6 /* Embed Foundation Extensions */,
);
buildRules = (
);
dependencies = (
FA456C4D26BDCC9400B83C20 /* PBXTargetDependency */,
ED46DDE02D098A0C007CACD6 /* PBXTargetDependency */,
);
name = OMaps;
productName = Maps;
@ -4001,6 +4089,25 @@
productReference = ED097E762BB80C320006ED01 /* OMapsTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
ED46DDCB2D098A0B007CACD6 /* OMapsWidgetExtensionExtension */ = {
isa = PBXNativeTarget;
buildConfigurationList = ED46DDE62D098A0C007CACD6 /* Build configuration list for PBXNativeTarget "OMapsWidgetExtensionExtension" */;
buildPhases = (
ED46DDC82D098A0B007CACD6 /* Sources */,
ED46DDC92D098A0B007CACD6 /* Frameworks */,
ED46DDCA2D098A0B007CACD6 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = OMapsWidgetExtensionExtension;
packageProductDependencies = (
);
productName = OMapsWidgetExtensionExtension;
productReference = ED46DDCC2D098A0B007CACD6 /* OMapsWidgetExtensionExtension.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@ -4023,6 +4130,9 @@
};
};
};
ED46DDCB2D098A0B007CACD6 = {
CreatedOnToolsVersion = 16.0;
};
};
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Maps" */;
@ -4089,6 +4199,7 @@
targets = (
6741A93D1BF340DE002C974C /* OMaps */,
ED097E752BB80C320006ED01 /* OMapsTests */,
ED46DDCB2D098A0B007CACD6 /* OMapsWidgetExtensionExtension */,
);
};
/* End PBXProject section */
@ -4294,6 +4405,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
ED46DDCA2D098A0B007CACD6 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
ED2D74382D14337500660FBF /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@ -4374,6 +4493,7 @@
9989273C2449E60200260CE2 /* BottomMenuInteractor.swift in Sources */,
47DF72B922520CE20004AB10 /* MWMRoutingOptions.mm in Sources */,
999FC12023ABA9AD00B0E6F9 /* SearchStyleSheet.swift in Sources */,
ED2D745E2D1433DE00660FBF /* TrackRecordingActivityManager.swift in Sources */,
3D15ACEE2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm in Sources */,
9977E6A32480F9BF0073780C /* BottomMenuLayerButtonRenderer.swift in Sources */,
3454D7D11E07F045004AF2AD /* UIImage+RGBAData.m in Sources */,
@ -4585,6 +4705,7 @@
F6E2FF3C1E097BA00083EBEC /* MWMSearchTableView.m in Sources */,
F6E2FF661E097BA00083EBEC /* MWMTTSSettingsViewController.mm in Sources */,
3454D7C21E07F045004AF2AD /* NSString+Categories.m in Sources */,
ED2D74662D1435A600660FBF /* LiveActivityManager.swift in Sources */,
34E7761F1F14DB48003040B3 /* PlacePageArea.swift in Sources */,
ED79A5D82BDF8D6100952D1F /* LocalDirectoryMonitor.swift in Sources */,
EDC4E34B2C5D1BEF009286A2 /* RecentlyDeletedCategoriesViewController.swift in Sources */,
@ -4701,6 +4822,7 @@
993DF10823F6BDB100AC231A /* IColors.swift in Sources */,
4707E4B12372FE860017DF6E /* PlacePageViewController.swift in Sources */,
34AB66441FC5AA330078E451 /* RouteManagerViewModelProtocol.swift in Sources */,
ED2D74652D14357F00660FBF /* TrackRecordingLiveActivityAttributes.swift in Sources */,
4701A93D243A917900B87683 /* TouchTransparentView.swift in Sources */,
991FCA2423B11E61009AD684 /* BookmarksStyleSheet.swift in Sources */,
993DF12823F6BDB100AC231A /* IStyleSheet.swift in Sources */,
@ -4783,6 +4905,21 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
ED46DDC82D098A0B007CACD6 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
ED2D743A2D14337500660FBF /* AppLogo.swift in Sources */,
ED2D743B2D14337500660FBF /* LiveActivityManager.swift in Sources */,
ED2D743C2D14337500660FBF /* StatisticDetailView.swift in Sources */,
ED2D743D2D14337500660FBF /* StatisticValueView.swift in Sources */,
ED2D743E2D14337500660FBF /* TrackRecordingLiveActivityAttributes.swift in Sources */,
ED2D743F2D14337500660FBF /* TrackRecordingLiveActivityConfiguration.swift in Sources */,
ED2D74402D14337500660FBF /* TrackRecordingLiveActivityView.swift in Sources */,
ED2D74412D14337500660FBF /* OMapsWidgetExtensionBundle.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@ -4791,6 +4928,11 @@
target = 6741A93D1BF340DE002C974C /* OMaps */;
targetProxy = ED097E7A2BB80C320006ED01 /* PBXContainerItemProxy */;
};
ED46DDE02D098A0C007CACD6 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = ED46DDCB2D098A0B007CACD6 /* OMapsWidgetExtensionExtension */;
targetProxy = ED46DDDF2D098A0C007CACD6 /* PBXContainerItemProxy */;
};
FA456C4D26BDCC9400B83C20 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = shaders_metal;
@ -5027,6 +5169,62 @@
};
name = Release;
};
ED46DDE32D098A0C007CACD6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 9Z6432XD7L;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = OMapsWidgetExtension/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = OMapsWidgetExtension;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Organic Maps. All rights reserved.";
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
PRODUCT_BUNDLE_IDENTIFIER = app.organicmaps.debug.OMapsWidgetExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
ED46DDE42D098A0C007CACD6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 9Z6432XD7L;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = OMapsWidgetExtension/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = OMapsWidgetExtension;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Organic Maps. All rights reserved.";
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = app.organicmaps.debug.OMapsWidgetExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
FAAB411B149BA84700C245B1 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 347526FA1DC0B00F00918CF5 /* common-debug.xcconfig */;
@ -5135,6 +5333,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
ED46DDE62D098A0C007CACD6 /* Build configuration list for PBXNativeTarget "OMapsWidgetExtensionExtension" */ = {
isa = XCConfigurationList;
buildConfigurations = (
ED46DDE32D098A0C007CACD6 /* Debug */,
ED46DDE42D098A0C007CACD6 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
/* End XCConfigurationList section */
};
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;

View file

@ -282,5 +282,7 @@
<string>OrganicMapsDEBUG</string>
</dict>
</dict>
<key>NSSupportsLiveActivities</key>
<true/>
</dict>
</plist>

View file

@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,35 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

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