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); } }