/***************************************************************** 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 bz.org.t2health.lib; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; 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; } /** * @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", true); } 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; } }