/******************************************************************************* * Copyright 2013-2016 alladin-IT GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package at.alladin.rmbt.android.util; import java.util.HashMap; import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.preference.PreferenceManager; import at.alladin.openrmbt.android.R; import at.alladin.rmbt.android.adapter.result.QoSCategoryPagerAdapter; import at.alladin.rmbt.android.main.AppConstants; import at.alladin.rmbt.client.helper.Config; import at.alladin.rmbt.client.v2.task.result.QoSTestResultEnum; public final class ConfigHelper { public final static String PREF_KEY_SWIPE_INTRO_COUNTER = "swipe_intro_counter"; public final static int SWIPE_INTRO_COUNTER_MAX = 2; public static final String DEFAULT_SERVER = "default"; public static SharedPreferences getSharedPreferences(final Context context) { return PreferenceManager.getDefaultSharedPreferences(context); } public static void setUUID(final Context context, final String uuid) { final SharedPreferences pref = getSharedPreferences(context); final boolean devMode = isOverrideControlServer(pref); pref.edit().putString(devMode ? "uuid_dev" : "uuid", uuid).apply(); } public static String getUUID(final Context context) { final SharedPreferences pref = getSharedPreferences(context); final boolean devMode = isOverrideControlServer(pref); return pref.getString(devMode ? "uuid_dev" : "uuid", ""); } public static void setLastNewsUid(final Context context, final long newsUid) { getSharedPreferences(context).edit().putLong("lastNewsUid", newsUid).apply(); } public static void setControlServerVersion(final Context context, final String controlServerVersion) { getSharedPreferences(context).edit().putString("controlServerVersion", controlServerVersion).apply(); } public static String getControlServerVersion(final Context context) { return getSharedPreferences(context).getString("controlServerVersion", null); } public static void setLastIp(final Context context, final String lastIp) { getSharedPreferences(context).edit().putString("lastIp", lastIp).apply(); } public static String getLastIp(final Context context) { return getSharedPreferences(context).getString("lastIp", null); } public static void setLastTestUuid(final Context context, final String lastUuid) { getSharedPreferences(context).edit().putString("lastTestUuid", lastUuid).apply(); } public static String getLastTestUuid(final Context context, boolean isDeleteOldValue) { String lastTestUuid = getSharedPreferences(context).getString("lastTestUuid", null); if (isDeleteOldValue) { setLastTestUuid(context, null); } return lastTestUuid; } public static long getLastNewsUid(final Context context) { return getSharedPreferences(context).getLong("lastNewsUid", 0); } public static boolean isSystemOutputRedirectedToFile(final Context context) { return getSharedPreferences(context).getBoolean("dev_debug_output", false); } public static boolean isDontShowMainMenuOnClose(final Context context) { return getSharedPreferences(context).getBoolean("dont_show_menu_before_exit", false); } public static boolean isGPS(final Context context) { return ! getSharedPreferences(context).getBoolean("no_gps", false); } public static boolean isSkipQoS(final Context context) { return getSharedPreferences(context).getBoolean("skip_qos", false); } public static void setLoopMode(final Context context, final boolean value) { getSharedPreferences(context).edit().putBoolean("loop_mode", value).apply(); } public static boolean isLoopMode(final Context context) { if (!isDevEnabled(context) && !isUserLoopModeActivated(context)) { return false; } return getSharedPreferences(context).getBoolean("loop_mode", false); } public static boolean isLoopModeGPS(final Context context) { return getSharedPreferences(context).getBoolean("loop_mode_gps", true); } public static boolean isLoopModeWakeLock(final Context context) { return getSharedPreferences(context).getBoolean("loop_mode_wake_lock", true); } private static int getInt(final Context context, String key, int defaultId, boolean lookup) { final int def = lookup ? context.getResources().getInteger(defaultId) : defaultId; final String string = getSharedPreferences(context).getString(key, Integer.toString(def)); try { return Integer.parseInt(string); } catch (NumberFormatException e) { return def; } } public static void setLoopModeMaxTests(final Context context, final int value) { getSharedPreferences(context).edit().putString("loop_mode_max_tests", Integer.toString(value)).apply(); } public static void setLoopModeTestCounter(final Context context, final int value) { getSharedPreferences(context).edit().putString("loop_mode_test_counter", Integer.toString(value)).apply(); } public static void incLoopModeTestCounter(final Context context) { setLoopModeTestCounter(context, getLoopModeTestCounter(context) + 1); } public static int getLoopModeMaxTests(final Context context) { final boolean isDevEnabled = isDevEnabled(context); return getInt(context, "loop_mode_max_tests", isDevEnabled ? R.integer.default_loop_max_tests : AppConstants.LOOP_MODE_DEFAULT_TESTS, isDevEnabled); } public static int getLoopModeMinDelay(final Context context) { return getInt(context, "loop_mode_min_delay", R.integer.default_loop_min_delay, true); } public static int getLoopModeMaxDelay(final Context context) { return getInt(context, "loop_mode_max_delay", R.integer.default_loop_max_delay, true); } public static int getLoopModeMaxMovement(final Context context) { return getInt(context, "loop_mode_max_movement", R.integer.default_loop_max_movement, true); } public static int getLoopModeTestCounter(final Context context) { return getInt(context, "loop_mode_test_counter", 0, false); } public static boolean isNDT(final Context context) { return getSharedPreferences(context).getBoolean("ndt", false); } public static void setNDT(final Context context, final boolean value) { getSharedPreferences(context).edit().putBoolean("ndt", value).apply(); } public static boolean isNDTDecisionMade(final Context context) { return getSharedPreferences(context).getBoolean("ndt_decision", false); } public static void setNDTDecisionMade(final Context context, final boolean value) { getSharedPreferences(context).edit().putBoolean("ndt_decision", value).apply(); } public static String getServerSelection(final Context context) { return getSharedPreferences(context).getString("server_selection", DEFAULT_SERVER); } public static void setServerSelection(final Context context, final String server) { getSharedPreferences(context).edit().putString("server_selection", server).apply(); } public static Set<String> getServers(final Context context) { return getSharedPreferences(context).getStringSet("servers", null); } public static void setServers(final Context context, final Set<String> servers) { final Set<String> oldServers = getServers(context); if (oldServers == null && servers == null) return; if (oldServers != null && servers != null && servers.equals(oldServers)) return; getSharedPreferences(context).edit().putStringSet("servers", servers).apply(); } public static String getPreviousTestStatus(final Context context) { return getSharedPreferences(context).getString("previous_test_status", null); } public static void setPreviousTestStatus(final Context context, final String status) { getSharedPreferences(context).edit().putString("previous_test_status", status).apply(); } public static int getTestCounter(final Context context) { int counter = getSharedPreferences(context).getInt("test_counter", 0); return counter; } public static int incAndGetNextTestCounter(final Context context) { int lastValue = getSharedPreferences(context).getInt("test_counter", 0); lastValue++; getSharedPreferences(context).edit().putInt("test_counter", lastValue).apply(); return lastValue; } public static boolean useNetworkInterfaceIpMethod(final Context context) { return getSharedPreferences(context).getBoolean("dev_debug_ip_method", false); } public static boolean isRetryRequiredOnIpv6SocketTimeout(final Context context) { return getSharedPreferences(context).getBoolean("dev_debug_ip_retry_on_socket_timeout", false); } public static boolean isIpPolling(final Context context) { return getSharedPreferences(context).getBoolean("dev_debug_ip_poll", true); } public static boolean isTCAccepted(final Context context) { final int tcNeedVersion = context.getResources().getInteger(R.integer.rmbt_terms_version); final int tcAcceptedVersion = getTCAcceptedVersion(context); return tcAcceptedVersion == tcNeedVersion; } public static int getTCAcceptedVersion(final Context context) { return getSharedPreferences(context).getInt("terms_and_conditions_accepted_version", 0); } public static void setTCAccepted(final Context context, final boolean accepted) { final int tcVersion = context.getResources().getInteger(R.integer.rmbt_terms_version); if (accepted) getSharedPreferences(context).edit().putInt("terms_and_conditions_accepted_version", tcVersion).apply(); else getSharedPreferences(context).edit().remove("terms_and_conditions_accepted_version").apply(); } private static boolean isOverrideControlServer(final SharedPreferences pref) { return pref.getBoolean("dev_control_override", false); } private static boolean isOverrideMapServer(final SharedPreferences pref) { return pref.getBoolean("dev_map_override", false); } private static String getDefaultControlServerName(final Context context, final SharedPreferences pref) { final boolean ipv4Only = pref.getBoolean("ipv4_only", false); if (ipv4Only) return getCachedControlServerNameIpv4(context); else return context.getResources().getString(R.string.default_control_host); } public static void setCachedIpv4CheckUrl(String url, Context context) { getSharedPreferences(context).edit().putString("url_ipv4_check", url).apply(); } public static String getCachedIpv4CheckUrl(Context context) { return getSharedPreferences(context).getString("url_ipv4_check", context.getString(R.string.default_control_check_ipv4_url)); } public static void setCachedIpv6CheckUrl(String url, Context context) { getSharedPreferences(context).edit().putString("url_ipv6_check", url).apply(); } public static String getCachedIpv6CheckUrl(Context context) { return getSharedPreferences(context).getString("url_ipv6_check", context.getString(R.string.default_control_check_ipv6_url)); } public static void setCachedControlServerNameIpv4(String url, Context context) { getSharedPreferences(context).edit().putString("cache_control_ipv4", url).apply(); } public static String getCachedControlServerNameIpv4(Context context) { return getSharedPreferences(context).getString("cache_control_ipv4", context.getString(R.string.default_control_host_ipv4_only)); } public static void setCachedControlServerNameIpv6(String url, Context context) { getSharedPreferences(context).edit().putString("cache_control_ipv6", url).apply(); } public static String getCachedControlServerNameIpv6(Context context) { return getSharedPreferences(context).getString("cache_control_ipv6", context.getString(R.string.default_control_host_ipv6_only)); } public static void setCachedMapServerPort(final int port, Context context) { getSharedPreferences(context).edit().putString("cache_map_server_port", String.valueOf(port)).apply(); } public static void setCachedMapServerSsl(final boolean isSsl, Context context) { getSharedPreferences(context).edit().putBoolean("cache_map_server_ssl", isSsl).apply(); } public static void setCachedMapServerName(final String url, Context context) { getSharedPreferences(context).edit().putString("cache_map_server", url).apply(); } public static int getCachedMapServerPort(Context context) { return getInt(context, "cache_map_server_port", R.integer.default_map_host_port, true); } public static boolean getCachedMapServerSsl(Context context) { return getSharedPreferences(context).getBoolean("cache_map_server_ssl", true); } public static String getCachedMapServerName(Context context) { return getSharedPreferences(context).getString("cache_map_server", context.getString(R.string.default_map_host)); } public static String getControlServerName(final Context context) { final SharedPreferences pref = getSharedPreferences(context); final boolean devMode = isOverrideControlServer(pref); if (devMode) { final boolean noControlServer = pref.getBoolean("dev_no_control_server", false); if (noControlServer) return null; return pref.getString("dev_control_hostname", getDefaultControlServerName(context, pref)); } else return getDefaultControlServerName(context, pref); } public static int getControlServerPort(final Context context) { final SharedPreferences pref = getSharedPreferences(context); final boolean devMode = isOverrideControlServer(pref); if (devMode) { final boolean noControlServer = pref.getBoolean("dev_no_control_server", false); if (noControlServer) return -1; try { return Integer.parseInt(pref.getString("dev_control_port", "443")); } catch (final NumberFormatException e) { return Config.RMBT_CONTROL_PORT; } } else return Config.RMBT_CONTROL_PORT; } public static boolean isControlSeverSSL(final Context context) { final SharedPreferences pref = getSharedPreferences(context); final boolean devMode = isOverrideControlServer(pref); if (devMode) { final boolean noControlServer = pref.getBoolean("dev_no_control_server", false); if (noControlServer) return false; if (pref.contains("dev_control_port")) return pref.getBoolean("dev_control_ssl", Config.RMBT_CONTROL_SSL); return Config.RMBT_CONTROL_SSL; } else return Config.RMBT_CONTROL_SSL; } public static boolean isQoSSeverSSL(final Context context) { final SharedPreferences pref = getSharedPreferences(context); return pref.getBoolean("dev_debug_qos_ssl", Config.RMBT_QOS_SSL); } public static String getMapServerName(final Context context) { final SharedPreferences pref = getSharedPreferences(context); final boolean devMode = isOverrideMapServer(pref); if (devMode) return pref.getString("dev_map_hostname", "develop"); else { return getCachedMapServerName(context); } } public static int getMapServerPort(final Context context) { final SharedPreferences pref = getSharedPreferences(context); final boolean devMode = isOverrideMapServer(pref); if (devMode) { try { return Integer.parseInt(pref.getString("dev_map_port", "443")); } catch (final NumberFormatException e) { return -1; } } else { return getCachedMapServerPort(context); } } public static boolean isMapSeverSSL(final Context context) { final SharedPreferences pref = getSharedPreferences(context); final boolean devMode = isOverrideMapServer(pref); if (devMode) return pref.getBoolean("dev_map_ssl", true); else { return getCachedMapServerSsl(context); } } public static String getTag(final Context context) { return getSharedPreferences(context).getString("tag", null); } public static void setMapServer(final Context context, final String host, final int port, final boolean isSsl) { setCachedMapServerName(host, context); setCachedMapServerPort(port, context); setCachedMapServerSsl(isSsl, context); } private static ConcurrentMap<String, String> volatileSettings = new ConcurrentHashMap<String, String>(); public static ConcurrentMap<String, String> getVolatileSettings() { return volatileSettings; } public static String getVolatileSetting(String key) { return volatileSettings.get(key); } public static void setCachedStatisticsUrl(String url, Context context) { getSharedPreferences(context).edit().putString("cache_statistics_url", url).apply(); } public static String getCachedStatisticsUrl(Context context) { return getSharedPreferences(context).getString("cache_statistics_url", null); } public static void setCachedHelpUrl(String url, Context context) { getSharedPreferences(context).edit().putString("cache_help_url", url).apply(); } public static String getCachedHelpUrl(Context context) { return getSharedPreferences(context).getString("cache_help_url", null); } /** * * @param context * @param qosNamesMap */ public static void setCachedQoSNames(Map<String, String> qosNamesMap, Context context) { System.out.println("new qos names: " + qosNamesMap); final SharedPreferences prefs = context.getSharedPreferences("cache_qos_names", Context.MODE_PRIVATE); final SharedPreferences.Editor edit = prefs.edit(); for (Entry<String, String> e : qosNamesMap.entrySet()) { edit.putString(e.getKey(), e.getValue()); } edit.apply(); } /** * * @param context * @return */ @SuppressWarnings("unchecked") public static Map<QoSTestResultEnum, String> getCachedQoSNames(Context context) { final Map<QoSTestResultEnum, String> namesMap = new HashMap<QoSTestResultEnum, String>(); final SharedPreferences prefs = context.getSharedPreferences("cache_qos_names", Context.MODE_PRIVATE); final Map<String, ?> cacheMap = prefs.getAll(); if (cacheMap != null && cacheMap.size() > 0) { Iterator<?> namesIterator = cacheMap.entrySet().iterator(); while(namesIterator.hasNext()) { Entry<String, String> name = (Entry<String, String>) namesIterator.next(); try { namesMap.put(QoSTestResultEnum.valueOf(name.getKey().toUpperCase(Locale.US)), name.getValue()); } catch (IllegalArgumentException e) { //in case the qos type doesn't exist e.printStackTrace(); } } } else { for (Entry<QoSTestResultEnum, Integer> e : QoSCategoryPagerAdapter.TITLE_MAP.entrySet()) { String name = context.getString(e.getValue()); namesMap.put(e.getKey(), name); } } return namesMap; } /** * * @param testType * @param context * @return */ public static String getCachedQoSNameByTestType(QoSTestResultEnum testType, Context context) { final SharedPreferences prefs = context.getSharedPreferences("cache_qos_names", Context.MODE_PRIVATE); String name = prefs.getString(testType.name(), null); if (name == null) { if (QoSCategoryPagerAdapter.TITLE_MAP.containsKey(testType)) { name = context.getString(QoSCategoryPagerAdapter.TITLE_MAP.get(testType)); } else { name = testType.name(); } } return name; } /* * Dev mode activation using separate app (obsolete) * * public static boolean isDevEnabled(final Context ctx) { return PackageManager.SIGNATURE_MATCH == ctx.getPackageManager().checkSignatures(ctx.getPackageName(), at.alladin.rmbt.android.util.Config.RMBT_DEV_UNLOCK_PACKAGE_NAME); } */ public static boolean isUserLoopModeActivated(final Context ctx) { return getSharedPreferences(ctx).getBoolean("user_loop_mode", false); } public static void setUserLoopModeState(final Context ctx, final boolean isEnabled) { getSharedPreferences(ctx).edit().putBoolean("user_loop_mode", isEnabled).apply(); } public static boolean isUserServerSelectionActivated(final Context ctx) { return getSharedPreferences(ctx).getBoolean("user_server_selection", false); } public static void setServerSelectionState(final Context ctx, final boolean isEnabled) { getSharedPreferences(ctx).edit().putBoolean("user_server_selection", isEnabled).apply(); } public static boolean isDevEnabled(final Context ctx) { return getSharedPreferences(ctx).getBoolean("developer_mode", false); } public static void setDevModeState(final Context ctx, final boolean isEnabled) { getSharedPreferences(ctx).edit().putBoolean("developer_mode", isEnabled).apply(); } public static boolean isValidCheckSum(final int dataInput) { final int testInput = dataInput % 100; final int testResult = (90 - (dataInput - testInput) % 89 + 77) % 100; //modified IBAN check sum with 89 as prime and offset of 77 return testResult == testInput; } }