/* * CDDL HEADER START * * The contents of this file are subject to the terms of the Common Development * and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at * src/com/vodafone360/people/VODAFONE.LICENSE.txt or * http://github.com/360/360-Engine-for-Android * See the License for the specific language governing permissions and * limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each file and * include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the fields * enclosed by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved. * Use is subject to license terms. */ package com.vodafone360.people; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.Properties; import android.content.Context; import com.vodafone360.people.utils.CloseUtils; import com.vodafone360.people.utils.LogUtils; /** * Handles default application settings. Stores default values for: - Server * URLS (Direct API and RPG) - Upgrade URL - Feature flags for * enabling/disabling functionality These values are overwritten by during the * build configuration files to allow different lifecycles to enable specific * features, and to target specific back end environments. Property defaults are * set in the Settings.java file. */ public final class SettingsManager { /** Comma string. **/ private static final String COMMA = ","; /** Static settings HashTable. **/ private static Hashtable<String, Object> sSettings; /** * Private constructor to prevent instantiation. */ private SettingsManager() { // Do nothing. } /** * Load properties from build configuration files. * * @param context Android Context. * @throws NullPointerException Configuration file not found. * @throws NullPointerException context is NULL. */ public static synchronized void loadProperties(final Context context) { if (context == null) { throw new NullPointerException( "SettingsManager.loadProperties() context cannot be NULL"); } if (sSettings != null) { return; } sSettings = new Hashtable<String, Object>(); sSettings.put(Settings.APP_KEY_ID, ""); sSettings.put(Settings.APP_SECRET_KEY, ""); sSettings.put(Settings.ENABLE_LOGCAT_KEY, Settings.DEFAULT_ENABLE_LOGCAT); sSettings.put(Settings.ENABLE_RPG_KEY, Settings.DEFAULT_ENABLE_RPG); sSettings.put(Settings.ENABLE_SNS_RESOURCE_ICON_KEY, Settings.DEFAULT_ENABLE_SNS_RESOURCE_ICON); sSettings.put(Settings.RPG_SERVER_KEY, Settings.DEFAULT_RPG_SERVER); sSettings.put(Settings.SERVER_URL_HESSIAN_KEY, Settings.DEFAULT_SERVER_URL_HESSIAN); sSettings.put(Settings.DEACTIVATE_ENGINE_LIST_KEY, new String[] {}); sSettings.put(Settings.ENABLE_AIDL_KEY, Settings.ENABLE_AIDL_DEFAULT); InputStream mFile = context.getResources().openRawResource(R.raw.config); if (mFile == null) { throw new NullPointerException("SettingsManager.loadProperties() " + "Config file not present in build"); } Properties mProps = new Properties(); try { mProps.load(mFile); for (Enumeration<Object> mEnum = mProps.keys(); mEnum.hasMoreElements();) { String mKey = (String) mEnum.nextElement(); String mValue = mProps.getProperty(mKey); sSettings.put(mKey.trim(), mValue.trim()); LogUtils.logV("SettingsManager.loadProperties() key[" + mKey.trim() + "] " + "value[" + mValue.trim() + "]"); } if (sSettings.get(Settings.DEACTIVATE_ENGINE_LIST_KEY) instanceof String) { /** Parse the array. **/ sSettings.put(Settings.DEACTIVATE_ENGINE_LIST_KEY, getStringArray((String) sSettings.get( Settings.DEACTIVATE_ENGINE_LIST_KEY))); } } catch (IOException e) { LogUtils.logE("SettingsManager.loadProperties() IOException", e); } finally { mProps.clear(); CloseUtils.close(mFile); } if (getBooleanProperty(Settings.ENABLE_LOGCAT_KEY)) { LogUtils.enableLogcat(); } } /** * Get property value for a specific key. * * @param key Key for required property. * @return property value. */ public static synchronized String getProperty(final String key) { if (key != null && sSettings != null) { return (String) sSettings.get(key); } else { return null; } } /** * Get boolean property value for key. * * @param key Key for required property. * @return boolean key value. */ public static boolean getBooleanProperty(final String key) { String mRes = (String) getProperty(key); boolean mRet = false; if (mRes != null) { mRet = Boolean.parseBoolean(mRes); } return mRet; } /** * Gets an array of strings for a specific key. * * @param key Key for required property. * @return String array property value, NULL if key is NULL or HashTable of * settings is NULL. */ public static synchronized String[] getStringArrayProperty( final String key) { if (key != null && sSettings != null) { return (String[]) sSettings.get(key); } else { return null; } } /** * Get a String array out of the given comma separated values. * * @param value Comma separated values * @return String array from given comma separated values. */ private static String[] getStringArray(final String value) { if (value == null) { return new String[] {}; } ArrayList<String> list = new ArrayList<String>(); int len = value.length(); int read = 0; int index = 0; while (read < len) { index = value.indexOf(COMMA, read); if (index > 0) { list.add(value.substring(read, index)); read = index + 1; } else if (index < 0) { list.add(value.substring(read, len)); read = len + 1; } else { read = len + 1; } } int size = list.size(); String[] ret; if (size > 0) { ret = new String[size]; } else { ret = new String[] {}; } for (int i = 0; i < size; i++) { ret[i] = list.get(i); LogUtils.logW("DEACTIVATE ENGINE: " + ret[i]); } return ret; } /** * Sets a property made of a key and its associated value. Note: Currently * only used for JUnit testing to force specific values. * * @param key the key * @param value the value associated with the key * @throws NullPointerException loadProperties() has not yet been called. */ public static synchronized void setProperty(final String key, final String value) { if (sSettings != null) { sSettings.put(key, value); } else { throw new NullPointerException("SettingsManager.setProperty() " + "The methoid SettingsManager.loadProperties() has not " + "yet been called."); } } }