Подготовка к крупным изменениям: карта, AIS и UI

- Яндекс/MapForge: правки в менеджерах и обёртках маркеров (улучшена отрисовка/логика)
- NMEAParser: корректировки парсинга и стабильности
- Модель AISVessel: уточнение полей/логики
- Настройки: правки в SettingsActivity и SettingsManager, актуализация AppController
- UI: обновлены activity_main, activity_settings, bottom_sheet_ais_vessel; меню main_menu
- Ресурсы: добавлен drawable/targetclassa.xml, обновлён drawable/target.xml
- Конфигурация: правки AndroidManifest и app/build.gradle
- Прочее: изменения в .idea (не влияют на сборку)
This commit is contained in:
2025-09-23 11:53:23 +03:00
parent a2f1775f9f
commit 41432665ea
37 changed files with 6561 additions and 161 deletions
+10 -3
View File
@@ -3,9 +3,16 @@
android:height="162.6dp"
android:viewportWidth="91.38"
android:viewportHeight="162.6">
<!-- Внешняя обводка для контраста -->
<path
android:pathData="M45.69,16.63l-39.75,141.47l79.5,0l-39.75,-141.47z"
android:strokeWidth="9"
android:fillColor="#00000000"
android:strokeColor="#000"/>
android:strokeWidth="12"
android:fillColor="#000000"
android:strokeColor="#000000"/>
<!-- Основная форма с внутренней обводкой -->
<path
android:pathData="M45.69,18.63l-37.75,139.47l75.5,0l-37.75,-139.47z"
android:strokeWidth="3"
android:fillColor="#B5B8B1"
android:strokeColor="#FFFFFF"/>
</vector>
@@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="88.5dp"
android:height="152.73dp"
android:viewportWidth="88.5"
android:viewportHeight="152.73">
<!-- Внешняя обводка для контраста -->
<path
android:pathData="M44.25,6.77l-39.75,44.69l0,96.77l79.5,0l0,-96.77l-39.75,-44.69z"
android:strokeWidth="9"
android:fillColor="#000000"
android:strokeColor="#000000"/>
<!-- Основная форма с внутренней обводкой -->
<path
android:pathData="M44.25,6.77l-39.75,44.69l0,96.77l79.5,0l0,-96.77l-39.75,-44.69z"
android:strokeWidth="3"
android:fillColor="#B5B8B1"
android:strokeColor="#FFFFFF"/>
</vector>
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_ais_targets"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/text_empty_state"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:text="Нет AIS целей\nВсе корабли уплыли"
android:textAlignment="center"
android:textSize="18sp"
android:textColor="@android:color/darker_gray"
android:gravity="center"
android:visibility="gone"/>
</LinearLayout>
+29
View File
@@ -54,6 +54,35 @@
android:minWidth="120dp"
android:background="@android:color/white" />
<Button
android:id="@+id/btn_ais_targets"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Цели AIS"
android:textSize="12sp"
android:minWidth="120dp"
android:background="@android:color/white"
android:layout_marginTop="8dp" />
<!-- Строки возраста последних сообщений GPS ($) и AIS (!) -->
<TextView
android:id="@+id/tv_gps_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GPS: --"
android:textSize="11sp"
android:textColor="@android:color/white"
android:layout_marginTop="8dp"/>
<TextView
android:id="@+id/tv_ais_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AIS: --"
android:textSize="11sp"
android:textColor="@android:color/white"
android:layout_marginTop="4dp"/>
</LinearLayout>
<!-- Компас -->
@@ -209,6 +209,152 @@
</com.google.android.material.card.MaterialCardView>
<!-- Настройки устаревания данных -->
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="⏰ Устаревание данных AIS"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:layout_marginBottom="12dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Настройте время, через которое данные о судах считаются устаревшими:"
android:textSize="14sp"
android:textColor="@android:color/darker_gray"
android:layout_marginBottom="16dp" />
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="Время предупреждения (минуты)"
app:helperText="Судна старше этого времени будут помечены как устаревшие">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_stale_warning_minutes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:text="5" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="Время удаления (минуты)"
app:helperText="Судна старше этого времени будут удалены с карты">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_stale_remove_minutes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:text="7" />
</com.google.android.material.textfield.TextInputLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="💡 Совет: Устаревшие суда отображаются с иконкой losingtarget.xml"
android:textSize="12sp"
android:textColor="@android:color/darker_gray"
android:layout_marginTop="8dp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- Настройки уведомлений -->
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="🔔 Уведомления о новых целях AIS"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@android:color/black"
android:layout_marginBottom="12dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Настройте уведомления при обнаружении новых судов:"
android:textSize="14sp"
android:textColor="@android:color/darker_gray"
android:layout_marginBottom="16dp" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/switch_vibration_enabled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Вибрация"
android:textSize="16sp"
android:checked="true"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Вибрация устройства при обнаружении нового судна"
android:textSize="12sp"
android:textColor="@android:color/darker_gray"
android:layout_marginBottom="16dp"
android:layout_marginStart="16dp" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/switch_sound_enabled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Звуковое уведомление"
android:textSize="16sp"
android:checked="true"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Звуковой сигнал при обнаружении нового судна"
android:textSize="12sp"
android:textColor="@android:color/darker_gray"
android:layout_marginBottom="8dp"
android:layout_marginStart="16dp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- Кнопки -->
<LinearLayout
android:layout_width="match_parent"
@@ -46,6 +46,17 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- Время назад -->
<TextView
android:id="@+id/bottom_sheet_ais_time_ago"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="⏱️ Время назад: --"
android:textSize="14sp"
android:textColor="@android:color/black"
android:layout_marginBottom="8dp"
android:background="@android:color/transparent"
android:padding="8dp" />
<!-- MMSI -->
<TextView
android:id="@+id/bottom_sheet_ais_mmsi"
@@ -58,17 +69,6 @@
android:background="@android:color/transparent"
android:padding="8dp" />
<!-- Название судна -->
<TextView
android:id="@+id/bottom_sheet_ais_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="📛 Название: --"
android:textSize="14sp"
android:textColor="@android:color/black"
android:layout_marginBottom="8dp"
android:background="@android:color/transparent"
android:padding="8dp" />
<!-- Позывной -->
<TextView
@@ -119,17 +119,52 @@
android:padding="8dp" />
<!-- Курс -->
<TextView
android:id="@+id/bottom_sheet_ais_course"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="🧭 Курс: --°"
android:orientation="horizontal">
<TextView
android:id="@+id/bottom_sheet_ais_course"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="🧭 COG: --°"
android:textSize="14sp"
android:textColor="@android:color/black"
android:layout_marginBottom="8dp"
android:background="@android:color/transparent"
android:padding="8dp" />
<!-- Направление -->
<TextView
android:id="@+id/bottom_sheet_ais_heading"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="🧭 HDG: --°"
android:textSize="14sp"
android:textColor="@android:color/black"
android:layout_marginBottom="8dp"
android:background="@android:color/transparent"
android:padding="8dp" />
<!-- Скорость поворота -->
<TextView
android:id="@+id/bottom_sheet_ais_rot"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="🔄 ROT: --°/мин"
android:textSize="14sp"
android:textColor="@android:color/black"
android:layout_marginBottom="8dp"
android:background="@android:color/transparent"
android:padding="8dp" />
</LinearLayout>
<!-- Скорость -->
<TextView
android:id="@+id/bottom_sheet_ais_speed"
@@ -238,17 +273,7 @@
android:background="@android:color/transparent"
android:padding="8dp" />
<!-- Время назад -->
<TextView
android:id="@+id/bottom_sheet_ais_time_ago"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="⏱️ Время назад: --"
android:textSize="14sp"
android:textColor="@android:color/black"
android:layout_marginBottom="8dp"
android:background="@android:color/transparent"
android:padding="8dp" />
</LinearLayout>
</ScrollView>
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="12dp">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="16sp"
android:text="Vessel" />
<TextView
android:id="@+id/tv_mmsi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="13sp"
android:text="MMSI" />
<TextView
android:id="@+id/tv_coords"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="13sp"
android:text="0, 0" />
<TextView
android:id="@+id/tv_course_speed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="13sp"
android:text="COG 0 • 0 kn" />
<TextView
android:id="@+id/tv_last_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="Обновлено: --" />
<TextView
android:id="@+id/tv_time_ago"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="N сек назад" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="8dp">
<Button
android:id="@+id/btn_marine_traffic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MarineTraffic" />
<Button
android:id="@+id/btn_center_on_map"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="На карте"
android:layout_marginStart="12dp" />
</LinearLayout>
</LinearLayout>
+6
View File
@@ -20,4 +20,10 @@
android:icon="@android:drawable/ic_menu_delete"
app:showAsAction="ifRoom" />
<item
android:id="@+id/menu_path_tracking"
android:title="Пути"
android:icon="@android:drawable/ic_menu_directions"
app:showAsAction="ifRoom" />
</menu>