/***************************************************************** BioZen Copyright (C) 2011 The National Center for Telehealth and Technology Eclipse Public License 1.0 (EPL-1.0) This library is free software; you can redistribute it and/or modify it under the terms of the Eclipse Public License as published by the Free Software Foundation, version 1.0 of the License. The Eclipse Public License is a reciprocal license, under Section 3. REQUIREMENTS iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. Post your updates and modifications to our GitHub or email to t2@tee2.org. This library is distributed WITHOUT ANY WARRANTY; without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License 1.0 (EPL-1.0) for more details. You should have received a copy of the Eclipse Public License along with this library; if not, visit http://www.opensource.org/licenses/EPL-1.0 *****************************************************************/ package com.t2.compassionMeditation; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import com.t2.R; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; /** * A static class that provides a global abstraction of an app's shared * preferences. * @author robbiev * */ public class SharedPref { private static SharedPreferences sSharedPref; private static void init(Context c) { if(sSharedPref == null) { sSharedPref = PreferenceManager.getDefaultSharedPreferences(c.getApplicationContext()); } } public SharedPreferences getSharedPreferences(Context c) { init(c); return sSharedPref; } /** * Returns the parameter name for a specified BT address * @param btAddress * @return * * Since the table in Shared pref is stored with parameter names * (the only thing known apriori) * we must interate through the names to see of we have a match for the address * */ public static String getParamForDevice(Context c, String btAddress) { String result = null; String[] paramNamesStringArray = c.getResources().getStringArray(R.array.parameter_names); for (String name : paramNamesStringArray) { String add = SharedPref.getString(c, name, null); if (add != null && add.equalsIgnoreCase(btAddress)) result = name; } if (result != null && result.equalsIgnoreCase(paramNamesStringArray[0])) { result = null; } return result; } public static String getDeviceForParam(Context c, String param) { return SharedPref.getString(c, param, null); } /** * Associates a BT address with a parameter name * Also removes this addresss from all other parameter names * * @param paramName * @param btAddress */ public static void setParamForDevice(Context c, String paramName, String btAddress) { // Now also need to make sure to remove this address from any other parameter names String[] paramNamesStringArray = c.getResources().getStringArray(R.array.parameter_names); for (String name : paramNamesStringArray) { if (name.equalsIgnoreCase(paramName)) { // Assign this address to a parameter name SharedPref.putString(c, paramName, btAddress); } else { String add = SharedPref.getString(c, name, null); if (add != null && add.equalsIgnoreCase(btAddress)) SharedPref.putString(c, name, null); } } } public static String[] getValues(SharedPreferences sharedPref, String key, String separator, String[] defaultValue) { String dataStr = sharedPref.getString(key, "!<[NULLFOUND]>["); if(dataStr.equals("!<[NULLFOUND]>[")) { return defaultValue; } return dataStr.split(separator); } public static void setValues(SharedPreferences sharedPref, String key, String separator, String[] values) { StringBuffer sb = new StringBuffer(); for(int i = 0; i < values.length; ++i) { sb.append(values[i]); sb.append(separator); } sharedPref.edit().putString(key, sb.toString()).commit(); } public static void setIntValues(SharedPreferences sharedPref, String key, String separator, int[] values) { StringBuffer sb = new StringBuffer(); for(int i = 0; i < values.length; ++i) { sb.append(Integer.toString(values[i])); sb.append(separator); } sharedPref.edit().putString(key, sb.toString()).commit(); } public static int[] getIntValues(SharedPreferences sharedPref, String key, String separator) { String dataStr = sharedPref.getString(key, "!<[NULLFOUND]>["); if(dataStr.equals("!<[NULLFOUND]>[")) { return null; } String strResults[] = dataStr.split(separator); int numItems = strResults.length; int results[] = new int[numItems]; for (int i = 0; i < numItems; i++ ) { results[i] = Integer.parseInt(strResults[i]); } return results; } /** * @see SharedPreferences.getBoolean * @param c * @param key * @param defValue * @return */ public static boolean getBoolean(Context c, String key, boolean defValue) { init(c); return sSharedPref.getBoolean(key, defValue); } /** * @see SharedPreferences.getFloat * @param c * @param key * @param defValue * @return */ public static float getFloat(Context c, String key, float defValue) { init(c); return sSharedPref.getFloat(key, defValue); } /** * @see SharedPreferences.getInt * @param c * @param key * @param defValue * @return */ public static int getInt(Context c, String key, int defValue) { init(c); return sSharedPref.getInt(key, defValue); } /** * @see SharedPreferences.getLong * @param c * @param key * @param defValue * @return */ public static long getLong(Context c, String key, long defValue) { init(c); return sSharedPref.getLong(key, defValue); } /** * @see SharedPreferences.getString * @param c * @param key * @param defValue * @return */ public static String getString(Context c, String key, String defValue) { init(c); return sSharedPref.getString(key, defValue); } /** * @see SharedPreferences.putBoolean * @param c * @param key * @param value */ public static void putBoolean(Context c, String key, boolean value) { init(c); sSharedPref.edit().putBoolean(key, value).commit(); } /** * @see SharedPreferences.putFloat * @param c * @param key * @param value */ public static void putFloat(Context c, String key, float value) { init(c); sSharedPref.edit().putFloat(key, value).commit(); } /** * @see SharedPreferences.putInt * @param c * @param key * @param value */ public static void putInt(Context c, String key, int value) { init(c); sSharedPref.edit().putInt(key, value).commit(); } /** * @see SharedPreferences.putLong * @param c * @param key * @param value */ public static void putLong(Context c, String key, long value) { init(c); sSharedPref.edit().putLong(key, value).commit(); } /** * @see SharedPreferences.putString * @param c * @param key * @param value */ public static void putString(Context c, String key, String value) { init(c); sSharedPref.edit().putString(key, value).commit(); } public static class Analytics { public static boolean isEnabled(Context c) { return getBoolean(c, "analytics_enabled", false); } public static void setIsEnabled(Context c, boolean b) { putBoolean(c, "analytics_enabled", b); } } public static class RemoteStackTrace { public static boolean isEnabled(Context c) { return getBoolean(c, "remote_stack_trace_enabled", true); } public static void setIsEnabled(Context c, boolean b) { putBoolean(c, "remote_stack_trace_enabled", b); } } public static long getBioSessionStartTime(SharedPreferences sharedPref) { return sharedPref.getLong("bio_session_start_time", 0); } public static void setBioSessionStartTime(SharedPreferences sharedPref, long time) { sharedPref.edit().putLong("bio_session_start_time", time).commit(); return; } public static long getBioSessionId(SharedPreferences sharedPref) { return sharedPref.getLong("bio_session_start_time", 0); } public static void setBioSessionId(SharedPreferences sharedPref, long time) { sharedPref.edit().putLong("bio_session_start_time", time).commit(); return; } public static long getBioSessionEndTime(SharedPreferences sharedPref) { return sharedPref.getLong("bio_session_end_time", 0); } public static void setBioSessionEndTime(SharedPreferences sharedPref, long time) { sharedPref.edit().putLong("bio_session_end_time", time).commit(); return; } public static class Security { public static boolean isEnabled(Context c) { return getBoolean(c, "security_enabled", false); } public static boolean doesPasswordMatch(Context c, String inputPassword) { return getString(c, "security_password", "").equals(md5(inputPassword)); } public static boolean isPasswordSet(Context c) { return getString(c, "security_password", "").length() > 0; } public static String getQuestion1(Context c) { return getQuestion(c, 1, sSharedPref); } public static String getQuestion2(Context c) { return getQuestion(c, 2, sSharedPref); } public static boolean doesAnswer1Match(Context c, String answer) { return doesAnswerMatch(c, 1, answer); } public static boolean isAnswer1Set(Context c) { return isAnswerSet(c, 1); } public static boolean doesAnswer2Match(Context c, String answer) { return doesAnswerMatch(c, 2, answer); } public static boolean isAnswer2Set(Context c) { return isAnswerSet(c, 2); } private static String getQuestion(Context c, int index, SharedPreferences sharedPref) { return getString(c, "security_question"+index, ""); } private static boolean doesAnswerMatch(Context c, int index, String answer) { return getString(c, "security_answer"+index, "").equals(md5(cleanString(answer))); } private static boolean isAnswerSet(Context c, int index) { return getString(c, "security_answer"+index, "").length() > 0; } public static void setEnabled(Context c, boolean b) { putBoolean(c, "security_enabled", b); } public static void setPassword(Context c, String password) { if(password != null && password.length() > 0) { putString(c, "security_password", md5(password.trim())); } } public static void setChallenge1(Context c, String question, String answer) { setChallenge(c, 1, question, answer); } public static void setChallenge2(Context c, String question, String answer) { setChallenge(c, 2, question, answer); } private static void setChallenge(Context c, int index, String question, String answer) { putString(c, "security_question"+ index, question); if(answer != null && answer.length() > 0) { putString(c, "security_answer"+ index, md5(cleanString(answer))); } } private static String cleanString(String str) { return str.trim().toLowerCase().replaceAll("[^a-z0-9]", ""); } } private static String md5(String s) { MessageDigest m = null; try { m = java.security.MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { // ignore } if (m != null) m.update(s.getBytes(), 0, s.length()); String hash = new BigInteger(1, m.digest()).toString(); return hash; } }