generated from Grigo/AndroidTemplate
25b1dabf73
Created menu Created udp support Created DockWidgets for compass and SOG/COG
203 lines
7.3 KiB
Java
203 lines
7.3 KiB
Java
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);
|
|
}
|
|
}
|