Created ship vectors (not added yet)

Created menu
Created udp support
Created DockWidgets for compass and SOG/COG
This commit is contained in:
2025-09-03 15:40:02 +03:00
parent 2734560160
commit 25b1dabf73
70 changed files with 3145 additions and 293 deletions
@@ -0,0 +1,202 @@
package com.grigowashere.aismap.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
/**
* Менеджер настроек приложения
* Управляет сохранением и загрузкой настроек в SharedPreferences
*/
public class SettingsManager {
private static final String TAG = "SettingsManager";
private static final String PREFS_NAME = "AISMapSettings";
// Ключи для настроек
private static final String KEY_UDP_PORT = "udp_port";
private static final String KEY_UDP_ENABLED = "udp_enabled";
private static final String KEY_ANDROID_NMEA_ENABLED = "android_nmea_enabled";
private static final String KEY_UDP_NMEA_ENABLED = "udp_nmea_enabled";
private static final String KEY_DATA_MODE = "data_mode";
// Значения по умолчанию
private static final int DEFAULT_UDP_PORT = 10110;
private static final boolean DEFAULT_UDP_ENABLED = true;
private static final boolean DEFAULT_ANDROID_NMEA_ENABLED = true;
private static final boolean DEFAULT_UDP_NMEA_ENABLED = true;
private static final String DEFAULT_DATA_MODE = "hybrid";
// Режимы работы с данными
public static final String DATA_MODE_HYBRID = "hybrid";
public static final String DATA_MODE_NMEA_ONLY = "nmea_only";
public static final String DATA_MODE_ANDROID_ONLY = "android_only";
private Context context;
private SharedPreferences prefs;
public SettingsManager(Context context) {
this.context = context;
this.prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}
/**
* Получает UDP порт
*/
public int getUDPPort() {
return prefs.getInt(KEY_UDP_PORT, DEFAULT_UDP_PORT);
}
/**
* Устанавливает UDP порт
*/
public void setUDPPort(int port) {
if (port < 1 || port > 65535) {
Log.w(TAG, "Некорректный порт: " + port + ", используем значение по умолчанию");
port = DEFAULT_UDP_PORT;
}
prefs.edit().putInt(KEY_UDP_PORT, port).apply();
Log.i(TAG, "UDP порт установлен: " + port);
}
/**
* Проверяет, включен ли UDP слушатель
*/
public boolean isUDPEnabled() {
return prefs.getBoolean(KEY_UDP_ENABLED, DEFAULT_UDP_ENABLED);
}
/**
* Включает/выключает UDP слушатель
*/
public void setUDPEnabled(boolean enabled) {
prefs.edit().putBoolean(KEY_UDP_ENABLED, enabled).apply();
Log.i(TAG, "UDP слушатель: " + (enabled ? "включен" : "выключен"));
}
/**
* Проверяет, включен ли Android NMEA
*/
public boolean isAndroidNMEAEnabled() {
return prefs.getBoolean(KEY_ANDROID_NMEA_ENABLED, DEFAULT_ANDROID_NMEA_ENABLED);
}
/**
* Включает/выключает Android NMEA
*/
public void setAndroidNMEAEnabled(boolean enabled) {
prefs.edit().putBoolean(KEY_ANDROID_NMEA_ENABLED, enabled).apply();
Log.i(TAG, "Android NMEA: " + (enabled ? "включен" : "выключен"));
}
/**
* Проверяет, включен ли UDP NMEA
*/
public boolean isUDPNMEAEnabled() {
return prefs.getBoolean(KEY_UDP_NMEA_ENABLED, DEFAULT_UDP_NMEA_ENABLED);
}
/**
* Включает/выключает UDP NMEA
*/
public void setUDPNMEAEnabled(boolean enabled) {
prefs.edit().putBoolean(KEY_UDP_NMEA_ENABLED, enabled).apply();
Log.i(TAG, "UDP NMEA: " + (enabled ? "включен" : "выключен"));
}
/**
* Получает режим работы с данными
*/
public String getDataMode() {
return prefs.getString(KEY_DATA_MODE, DEFAULT_DATA_MODE);
}
/**
* Устанавливает режим работы с данными
*/
public void setDataMode(String mode) {
if (!isValidDataMode(mode)) {
Log.w(TAG, "Некорректный режим данных: " + mode + ", используем значение по умолчанию");
mode = DEFAULT_DATA_MODE;
}
prefs.edit().putString(KEY_DATA_MODE, mode).apply();
Log.i(TAG, "Режим данных установлен: " + mode);
}
/**
* Проверяет корректность режима данных
*/
private boolean isValidDataMode(String mode) {
return DATA_MODE_HYBRID.equals(mode) ||
DATA_MODE_NMEA_ONLY.equals(mode) ||
DATA_MODE_ANDROID_ONLY.equals(mode);
}
/**
* Проверяет, включен ли гибридный режим
*/
public boolean isHybridMode() {
return DATA_MODE_HYBRID.equals(getDataMode());
}
/**
* Проверяет, включен ли режим только NMEA
*/
public boolean isNMEAOnlyMode() {
return DATA_MODE_NMEA_ONLY.equals(getDataMode());
}
/**
* Проверяет, включен ли режим только Android GPS
*/
public boolean isAndroidOnlyMode() {
return DATA_MODE_ANDROID_ONLY.equals(getDataMode());
}
/**
* Сбрасывает все настройки к значениям по умолчанию
*/
public void resetToDefaults() {
prefs.edit()
.putInt(KEY_UDP_PORT, DEFAULT_UDP_PORT)
.putBoolean(KEY_UDP_ENABLED, DEFAULT_UDP_ENABLED)
.putBoolean(KEY_ANDROID_NMEA_ENABLED, DEFAULT_ANDROID_NMEA_ENABLED)
.putBoolean(KEY_UDP_NMEA_ENABLED, DEFAULT_UDP_NMEA_ENABLED)
.putString(KEY_DATA_MODE, DEFAULT_DATA_MODE)
.apply();
Log.i(TAG, "Настройки сброшены к значениям по умолчанию");
}
/**
* Получает все настройки в виде строки для отладки
*/
public String getSettingsSummary() {
return String.format(
"UDP: порт=%d, включен=%s\n" +
"Android NMEA: %s\n" +
"UDP NMEA: %s\n" +
"Режим данных: %s",
getUDPPort(),
isUDPEnabled() ? "да" : "нет",
isAndroidNMEAEnabled() ? "включен" : "выключен",
isUDPNMEAEnabled() ? "включен" : "выключен",
getDataMode()
);
}
/**
* Проверяет, нужно ли перезапустить UDP слушатель
*/
public boolean shouldRestartUDP(int currentPort, boolean currentEnabled) {
return getUDPPort() != currentPort || isUDPEnabled() != currentEnabled;
}
/**
* Проверяет, нужно ли перезапустить NMEA парсер
*/
public boolean shouldRestartNMEA(boolean currentAndroidNMEA, boolean currentUDPNMEA, String currentDataMode) {
return isAndroidNMEAEnabled() != currentAndroidNMEA ||
isUDPNMEAEnabled() != currentUDPNMEA ||
!getDataMode().equals(currentDataMode);
}
}