/*
* This file is part of WhereYouGo.
*
* WhereYouGo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* WhereYouGo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with WhereYouGo. If not, see <http://www.gnu.org/licenses/>.
*
* Copyright (C) 2012 Menion <whereyougo@asamm.cz>
*/
package menion.android.whereyougo.settings;
import java.util.Locale;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.view.Window;
import android.view.WindowManager;
import locus.api.objects.extra.Location;
import menion.android.whereyougo.gui.extension.CustomPreferenceActivity;
import menion.android.whereyougo.gui.extension.MainApplication;
import menion.android.whereyougo.hardware.location.LocationState;
import menion.android.whereyougo.utils.A;
import menion.android.whereyougo.utils.Logger;
public class Settings {
private static final String TAG = "Settings";
/** last application version that run on machine */
private static final String KEY_S_APPLICATION_VERSION_LAST = "KEY_S_APPLICATION_VERSION_LAST";
// GLOBAL
/** enable fullscreen mode on newly created activities */
public static final String KEY_B_FULLSCREEN = "KEY_B_FULLSCREEN";
public static final boolean DEFAULT_FULLSCREEN = false;
/** screen highlight mode */
public static final String KEY_S_HIGHLIGHT = "KEY_S_HIGHLIGHT";
public static final int VALUE_HIGHLIGHT_OFF = 0;
public static final int VALUE_HIGHLIGHT_ONLY_GPS = 1;
public static final int VALUE_HIGHLIGHT_ALWAYS = 2;
public static final String DEFAULT_HIGHLIGHT = String.valueOf(VALUE_HIGHLIGHT_OFF);
// GENERAL
/** default language */
public static final String KEY_S_LANGUAGE = "KEY_S_LANGUAGE";
public static final String VALUE_LANGUAGE_DEFAULT = "default";
public static final String VALUE_LANGUAGE_AR = "ar";
public static final String VALUE_LANGUAGE_CZ = "cs";
public static final String VALUE_LANGUAGE_DA = "da";
public static final String VALUE_LANGUAGE_DE = "de";
public static final String VALUE_LANGUAGE_EL = "el";
public static final String VALUE_LANGUAGE_EN = "en";
public static final String VALUE_LANGUAGE_ES = "es";
public static final String VALUE_LANGUAGE_FI = "fi";
public static final String VALUE_LANGUAGE_FR = "fr";
public static final String VALUE_LANGUAGE_HU = "hu";
public static final String VALUE_LANGUAGE_IT = "it";
public static final String VALUE_LANGUAGE_JA = "ja";
public static final String VALUE_LANGUAGE_KO = "ko";
public static final String VALUE_LANGUAGE_NL = "nl";
public static final String VALUE_LANGUAGE_PL = "pl";
public static final String VALUE_LANGUAGE_PT = "pt";
public static final String VALUE_LANGUAGE_PT_BR = "pt_BR";
public static final String VALUE_LANGUAGE_RU = "ru";
public static final String VALUE_LANGUAGE_SK = "sk";
public static final String DEFAULT_LANGUAGE = VALUE_LANGUAGE_DEFAULT;
/** confirmation on exit */
public static final String KEY_B_CONFIRM_ON_EXIT = "KEY_B_CONFIRM_ON_EXIT";
public static final boolean DEFAULT_CONFIRM_ON_EXIT = true;
/** last used index of coordinates format */
public static final String KEY_I_GET_COORDINATES_LAST_INDEX = "KEY_I_GET_COORDINATES_LAST_INDEX";
public static final int DEFAULT_GET_COORDINATES_LAST_INDEX = 0;
// GPS & LOCATION
/** if GPS should start automatically after application start */
public static final String KEY_B_START_GPS_AUTOMATICALLY = "KEY_B_START_GPS_AUTOMATICALLY";
public static final boolean DEFAULT_START_GPS_AUTOMATICALLY = true;
/** last known latitude */
protected static final String KEY_F_LAST_KNOWN_LOCATION_LATITUDE = "KEY_F_LAST_KNOWN_LOCATION_LATITUDE";
protected static final float DEFAULT_LAST_KNOWN_LOCATION_LATITUDE = 50.07967f;
/** last known longitude */
protected static final String KEY_F_LAST_KNOWN_LOCATION_LONGITUDE = "KEY_F_LAST_KNOWN_LOCATION_LONGITUDE";
protected static final float DEFAULT_LAST_KNOWN_LOCATION_LONGITUDE = 14.42980f;
/** last known altitude */
protected static final String KEY_F_LAST_KNOWN_LOCATION_ALTITUDE = "KEY_F_LAST_KNOWN_LOCATION_ALTITUDE";
protected static final float DEFAULT_LAST_KNOWN_LOCATION_ALTITUDE = 0.0f;
/** add manual correction to altitude */
public static final String KEY_S_GPS_ALTITUDE_MANUAL_CORRECTION = "KEY_S_GPS_ALTITUDE_MANUAL_CORRECTION";
public static final String DEFAULT_GPS_ALTITUDE_MANUAL_CORRECTION = String.valueOf(0.0);
/** minimum time for notification */
public static final String KEY_S_GPS_MIN_TIME_NOTIFICATION = "KEY_S_GPS_MIN_TIME_NOTIFICATION";
public static final String DEFAULT_GPS_MIN_TIME_NOTIFICATION = "0";
/** beep on first gps fix */
public static final String KEY_B_GPS_BEEP_ON_GPS_FIX = "KEY_B_GPS_BEEP_ON_GPS_FIX";
public static final boolean DEFAULT_GPS_BEEP_ON_GPS_FIX = true;
/** disable GPS when not needed */
public static final String KEY_B_GPS_DISABLE_WHEN_HIDE = "KEY_B_GPS_DISABLE_WHEN_HIDE";
public static final boolean DEFAULT_GPS_DISABLE_WHEN_HIDE = true;
// SENSORS
/** is hardware orientation sensor enabled */
public static final String KEY_B_HARDWARE_COMPASS_SENSOR = "KEY_B_HARDWARE_COMPASS_SENSOR";
public static final boolean DEFAULT_HARDWARE_COMPASS_SENSOR = true;
/** is hardware orientation sensor enabled */
public static final String KEY_B_HARDWARE_COMPASS_AUTO_CHANGE = "KEY_B_HARDWARE_COMPASS_AUTO_CHANGE";
public static final boolean DEFAULT_HARDWARE_COMPASS_AUTO_CHANGE = false;
/** is hardware orientation sensor enabled */
public static final String KEY_S_HARDWARE_COMPASS_AUTO_CHANGE_VALUE = "KEY_S_HARDWARE_COMPASS_AUTO_CHANGE_VALUE";
public static final String DEFAULT_HARDWARE_COMPASS_AUTO_CHANGE_VALUE = "1";
/** use true or magnetic bearing */
public static final String KEY_B_SENSORS_BEARING_TRUE = "KEY_B_SENSORS_BEARING_TRUE";
public static final boolean DEFAULT_SENSORS_BEARING_TRUE = true;
/** orientation filter */
public static final String KEY_S_SENSORS_ORIENT_FILTER = "KEY_S_SENSORS_ORIENT_FILTER";
public static final int VALUE_SENSORS_ORIENT_FILTER_NO = 0;
public static final int VALUE_SENSORS_ORIENT_FILTER_LIGHT = 1;
public static final int VALUE_SENSORS_ORIENT_FILTER_MEDIUM = 2;
public static final int VALUE_SENSORS_ORIENT_FILTER_HEAVY = 3;
public static final String DEFAULT_SENSORS_ORIENT_FILTER = String.valueOf(VALUE_SENSORS_ORIENT_FILTER_MEDIUM);
// GUIDING
/** is guiding sounds enabled on compass screen */
public static final String KEY_B_GUIDING_COMPASS_SOUNDS = "KEY_B_GUIDING_COMPASS_SOUNDS";
public static final boolean DEFAULT_GUIDING_COMPASS_SOUNDS = false;
/** disable gps when screen off during guiding */
public static final String KEY_B_GUIDING_GPS_REQUIRED = "KEY_B_GUIDING_GPS_REQUIRED";
public static final boolean DEFAULT_GUIDING_GPS_REQUIRED = true;
/** waypoint sounds */
public static final String KEY_S_GUIDING_WAYPOINT_SOUND = "KEY_S_GUIDING_WAYPOINT_SOUND";
public static final int VALUE_GUIDING_WAYPOINT_SOUND_INCREASE_CLOSER = 0;
public static final int VALUE_GUIDING_WAYPOINT_SOUND_BEEP_ON_DISTANCE = 1;
public static final int VALUE_GUIDING_WAYPOINT_SOUND_CUSTOM_SOUND = 2;
public static final String DEFAULT_GUIDING_WAYPOINT_SOUND = String.valueOf(VALUE_GUIDING_WAYPOINT_SOUND_BEEP_ON_DISTANCE);
public static final String VALUE_GUIDING_WAYPOINT_SOUND_CUSTOM_SOUND_URI = "";
/** waypoint sounds beep distance */
public static final String KEY_S_GUIDING_WAYPOINT_SOUND_DISTANCE = "KEY_S_GUIDING_WAYPOINT_SOUND_DISTANCE";
public static final String DEFAULT_GUIDING_WAYPOINT_SOUND_DISTANCE = "100";
// UNITS PARAMETRES
/** default latitude/longitude format */
public static final String KEY_S_UNITS_COO_LATLON = "KEY_S_UNITS_COO_LATLON";
public static final int VALUE_UNITS_COO_LATLON_DEC = 0;
public static final int VALUE_UNITS_COO_LATLON_MIN = 1;
public static final int VALUE_UNITS_COO_LATLON_SEC = 2;
public static final String DEFAULT_UNITS_COO_LATLON = String.valueOf(VALUE_UNITS_COO_LATLON_MIN);
/** default length format */
public static final String KEY_S_UNITS_LENGTH = "KEY_S_UNITS_LENGTH";
public static final int VALUE_UNITS_LENGTH_ME = 0;
public static final int VALUE_UNITS_LENGTH_IM = 1;
public static final int VALUE_UNITS_LENGTH_NA = 2;
public static final String DEFAULT_UNITS_LENGTH = String.valueOf(VALUE_UNITS_LENGTH_ME);
/** default height format */
public static final String KEY_S_UNITS_ALTITUDE = "KEY_S_UNITS_ALTITUDE";
public static final int VALUE_UNITS_ALTITUDE_METRES = 0;
public static final int VALUE_UNITS_ALTITUDE_FEET = 1;
public static final String DEFAULT_UNITS_ALTITUDE = String.valueOf(VALUE_UNITS_ALTITUDE_METRES);
/** default angle format */
public static final String KEY_S_UNITS_SPEED = "KEY_S_UNITS_SPEED";
public static final int VALUE_UNITS_SPEED_KMH = 0;
public static final int VALUE_UNITS_SPEED_MILH = 1;
public static final int VALUE_UNITS_SPEED_KNOTS = 2;
public static final String DEFAULT_UNITS_SPEED = String.valueOf(VALUE_UNITS_SPEED_KMH);
/** default angle format */
public static final String KEY_S_UNITS_ANGLE = "KEY_S_UNITS_ANGLE";
public static final int VALUE_UNITS_ANGLE_DEGREE = 0;
public static final int VALUE_UNITS_ANGLE_MIL = 1;
public static final String DEFAULT_UNITS_ANGLE = String.valueOf(VALUE_UNITS_ANGLE_DEGREE);
public static boolean getPrefBoolean(Context context, String key, boolean def) {
// Logger.v(TAG, "getPrefBoolean(" + key + ", " + def + ")");
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(key, def);
}
public static void setPrefBoolean(Context context, String key, boolean value) {
// Logger.v(TAG, "setPrefBoolean(" + key + ", " + value + ")");
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(key, value).commit();
}
public static int getPrefInt(Context context, String key, int def) {
// Logger.v(TAG, "getPrefInt(" + key + ", " + def + ")");
return PreferenceManager.getDefaultSharedPreferences(context).getInt(key, def);
}
public static void setPrefInt(Context context, String key, int value) {
// Logger.v(TAG, "setPrefInt(" + key + ", " + value + ")");
PreferenceManager.getDefaultSharedPreferences(context).edit().putInt(key, value).commit();
}
public static float getPrefFloat(Context context, String key, float def) {
// Logger.v(TAG, "getPrefFloat(" + key + ", " + def + ")");
return PreferenceManager.getDefaultSharedPreferences(context).getFloat(key, def);
}
public static void setPrefFloat(Context context, String key, float value) {
// Logger.v(TAG, "setPrefFloat(" + key + ", " + value + ")");
PreferenceManager.getDefaultSharedPreferences(context).edit().putFloat(key, value).commit();
}
public static String getPrefString(Context context, String key, String def) {
// Logger.v(TAG, "getPrefString(" + key + ", " + def + ")");
return PreferenceManager.getDefaultSharedPreferences(context).getString(key, def);
}
public static void setPrefString(Context context, String key, String value) {
// Logger.v(TAG, "setPrefString(" + key + ", " + value + ")");
PreferenceManager.getDefaultSharedPreferences(context).edit().putString(key, value).commit();
}
public static boolean getPrefBoolean(String key, boolean def) {
if (A.getApp() == null) {
return def;
}
return PreferenceManager.getDefaultSharedPreferences(A.getApp()).getBoolean(key, def);
}
public static void setPrefBoolean(String key, boolean value) {
if (A.getApp() == null) {
return;
}
PreferenceManager.getDefaultSharedPreferences(A.getApp()).edit().putBoolean(key, value).commit();
}
public static int getPrefInt(String key, int def) {
if (A.getApp() == null) {
return def;
}
return PreferenceManager.getDefaultSharedPreferences(A.getApp()).getInt(key, def);
}
public static void setPrefInt(String key, int value) {
if (A.getApp() == null) {
return;
}
PreferenceManager.getDefaultSharedPreferences(A.getApp()).edit().putInt(key, value).commit();
}
public static float getPrefFloat(String key, float def) {
if (A.getApp() == null) {
return def;
}
return PreferenceManager.getDefaultSharedPreferences(A.getApp()).getFloat(key, def);
}
public static void setPrefFloat(String key, float value) {
if (A.getApp() == null) {
return;
}
PreferenceManager.getDefaultSharedPreferences(A.getApp()).edit().putFloat(key, value).commit();
}
public static String getPrefString(String key, String def) {
if (A.getApp() == null) {
return def;
}
return PreferenceManager.getDefaultSharedPreferences(A.getApp()).getString(key, def);
}
public static void setPrefString(String key, String value) {
if (A.getApp() == null) {
return;
}
PreferenceManager.getDefaultSharedPreferences(A.getApp()).edit().putString(key, value).commit();
}
/* APPLICATION VERSION */
public static int getApplicationVersionLast() {
return PreferenceManager.getDefaultSharedPreferences(A.getApp()).
getInt(KEY_S_APPLICATION_VERSION_LAST, 0);
}
public static int getApplicationVersionActual() {
try {
return A.getApp().getPackageManager().getPackageInfo(A.getApp().getPackageName(), 0).versionCode;
} catch (NameNotFoundException e) {
Logger.e(TAG, "getApplicationVersionActual()", e);
return 0;
}
}
public static void setApplicationVersionLast(int lastVersion) {
PreferenceManager.getDefaultSharedPreferences(A.getApp()).edit().
putInt(KEY_S_APPLICATION_VERSION_LAST, lastVersion).
commit();
}
public static String getApplicationVersionActualName() {
try {
return A.getApp().getPackageManager().getPackageInfo(A.getApp().getPackageName(), 0).versionName;
} catch (NameNotFoundException e) {
Logger.e(TAG, "getApplicationVersionActual()", e);
return "";
}
}
/* LANGUAGE */
private static String loca = null;
public static String getLanguageCode() {
if (loca == null) {
//String lang = getPrefString(KEY_S_LANGUAGE, Locale.getDefault().getLanguage());
String lang = Locale.getDefault().getLanguage();
Logger.w(TAG, "getLanguageCode() - " + lang);
if (lang == null)
return VALUE_LANGUAGE_EN;
if (lang.equals(VALUE_LANGUAGE_CZ)) {
loca = VALUE_LANGUAGE_CZ;
} else {
loca = VALUE_LANGUAGE_EN;
}
}
return loca;
}
/* LAST KNOW LOCATION */
/** last known location */
public static Location lastKnownLocation;
public static Location getLastKnownLocation(Context c) {
if (lastKnownLocation == null) {
lastKnownLocation = new Location(TAG);
lastKnownLocation.setLatitude(getPrefFloat(c, KEY_F_LAST_KNOWN_LOCATION_LATITUDE,
DEFAULT_LAST_KNOWN_LOCATION_LATITUDE));
lastKnownLocation.setLongitude(getPrefFloat(c, KEY_F_LAST_KNOWN_LOCATION_LONGITUDE,
DEFAULT_LAST_KNOWN_LOCATION_LONGITUDE));
lastKnownLocation.setAltitude(getPrefFloat(c, KEY_F_LAST_KNOWN_LOCATION_ALTITUDE,
DEFAULT_LAST_KNOWN_LOCATION_ALTITUDE));
}
return lastKnownLocation;
}
public static void setLastKnownLocation() {
try {
PreferenceManager.getDefaultSharedPreferences(A.getApp()).edit().
putFloat(KEY_F_LAST_KNOWN_LOCATION_LATITUDE,
(float) LocationState.getLocation().getLatitude()).
putFloat(KEY_F_LAST_KNOWN_LOCATION_LONGITUDE,
(float) LocationState.getLocation().getLongitude()).
putFloat(KEY_F_LAST_KNOWN_LOCATION_ALTITUDE,
(float) LocationState.getLocation().getAltitude()).
commit();
} catch (Exception e) {
Logger.e(TAG, "setLastKnownLocation()", e);
}
}
// setted from onResume();
private static Activity currentActivity;
public static boolean existCurrentActivity() {
return currentActivity != null;
}
public static Activity getCurrentActivity() {
return currentActivity == null ? A.getMain() : currentActivity;
}
public static void setCurrentActivity(Activity activity) {
if (Settings.currentActivity == null && activity != null)
MainApplication.appRestored();
Settings.currentActivity = activity;
}
public static boolean setScreenBasic(Activity activity) {
try {
//Logger.w(TAG, "setFullscreen(" + activity.getLocalClassName() + ")");
// hide title
if (!(activity instanceof CustomPreferenceActivity)) {
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
}
return true;
} catch (Exception e) {
Logger.e(TAG, "setFullScreen(" + activity + ")", e);
}
return false;
}
public static void setScreenFullscreen(Activity activity) {
try {
if (!(activity instanceof CustomPreferenceActivity)) {
// set fullScreen
if (SettingValues.GLOBAL_FULLSCREEN) {
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
} catch (Exception e) {
Logger.e(TAG, "setFullScreen(" + activity + ")", e);
}
}
private static PowerManager.WakeLock wl;
public static void enableWakeLock() {
try {
boolean disable = false;
if (SettingValues.GLOBAL_HIGHLIGHT == VALUE_HIGHLIGHT_OFF) {
disable = true;
} else if (SettingValues.GLOBAL_HIGHLIGHT == VALUE_HIGHLIGHT_ONLY_GPS) {
if (!LocationState.isActuallyHardwareGpsOn()) {
disable = true;
}
}
Logger.w(TAG, "enableWakeLock(), dis:" + disable + ", wl:" + wl);
if (disable && wl != null) {
disableWakeLock();
} else if (!disable && wl == null) {
PowerManager pm = (PowerManager) A.getApp().getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG);
wl.acquire();
}
//Logger.w(TAG, "enableWakeLock(), res:" + wl);
} catch (Exception e) {
Logger.e(TAG, "enableWakeLock(), e:" + e.toString());
}
}
public static void disableWakeLock() {
Logger.w(TAG, "disableWakeLock(), wl:" + wl);
if (wl != null) {
wl.release();
wl = null;
}
}
}