package com.zachklipp.captivate;
import com.zachklipp.captivate.app.PreferenceActivity;
import com.zachklipp.captivate.util.StringHelper;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceManager;
import android.util.AttributeSet;
import android.widget.Toast;
public class Preferences
{
public static final String FEEDBACK_KEY = "feedback_pref";
public static final String ABOUT_KEY = "about_pref";
public static final String ENABLED_KEY = "detector_enabled_pref";
public static final boolean ENABLED_DEFAULT = true;
public static final String DEBUG_OVERRIDE_KEY = "debug_override_pref";
public static final boolean DEBUG_OVERRIDE_DEFAULT = false;
/**
* Determines the number of seconds between checks for successful sign-in
* when behind a blocked portal.
*/
public static final String SIGNIN_CHECK_SECONDS_PREFERENCE_KEY
= "state_refresh_interval_seconds";
public static final int SIGNIN_CHECK_SECONDS_DEFAULT = 15;
/**
* Determines the number of minutes between checks for session timeout
* when behind a signed-in portal.
*/
public static final String SESSION_TIMEOUT_CHECK_SECONDS_KEY = "session_timeout_check_seconds";
// Default is an hour and a minute
public static final int SESSION_TIMEOUT_CHECK_SECONDS_DEFAULT = 61 * 60;
private Context mContext;
private SharedPreferences mPreferences;
public static void showPreferences(Context context)
{
context.startActivity(new Intent(context, PreferenceActivity.class));
}
public static Preferences getPreferences(Context context)
{
return new Preferences(context,
PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()));
}
private Preferences(Context context, SharedPreferences preferences)
{
mContext = context;
mPreferences = preferences;
}
public boolean isEnabled()
{
return mPreferences.getBoolean(ENABLED_KEY, ENABLED_DEFAULT);
}
public boolean isDebugOverrideEnabled()
{
return BuildConfig.DEBUG && mPreferences.getBoolean(DEBUG_OVERRIDE_KEY, DEBUG_OVERRIDE_DEFAULT);
}
public Preference getDebugOverridePreference()
{
CheckBoxPreference overridePref = new CheckBoxPreference(mContext);
overridePref.setKey(Preferences.DEBUG_OVERRIDE_KEY);
overridePref.setDefaultValue(Preferences.DEBUG_OVERRIDE_DEFAULT);
overridePref.setTitle("Override portal");
overridePref.setSummaryOn("A fake portal will always be detected.");
overridePref.setSummaryOff("The portal detector will look for a portal.");
return overridePref;
}
public int getSigninCheckSeconds()
{
return mPreferences.getInt(SIGNIN_CHECK_SECONDS_PREFERENCE_KEY, SIGNIN_CHECK_SECONDS_DEFAULT);
}
public Preference getSigninCheckSecondsPreference()
{
final EditIntPreference signinCheckPreference = new EditIntPreference(mContext);
final OnPreferenceChangeListener changeListener = new OnPreferenceChangeListener()
{
public boolean onPreferenceChange(Preference preference, Object newValue)
{
int intValue = Integer.parseInt(newValue.toString());
signinCheckPreference.setSummary(StringHelper.format(mContext,
"When blocked portal is detected, check for signin every %d seconds.", intValue));
return true;
}
};
signinCheckPreference.setKey(Preferences.SIGNIN_CHECK_SECONDS_PREFERENCE_KEY);
signinCheckPreference.setDefaultValue(Preferences.SIGNIN_CHECK_SECONDS_DEFAULT);
signinCheckPreference.setTitle("Signin check interval (seconds)");
signinCheckPreference.setDialogTitle("Signin Check Interval");
signinCheckPreference.setOnPreferenceChangeListener(changeListener);
changeListener.onPreferenceChange(signinCheckPreference, getSigninCheckSeconds());
return signinCheckPreference;
}
public int getSessionTimeoutCheckMinutes()
{
return mPreferences.getInt(SESSION_TIMEOUT_CHECK_SECONDS_KEY, SESSION_TIMEOUT_CHECK_SECONDS_DEFAULT);
}
public Preference getResetToDefaultsPreference()
{
Preference resetPreference = new Preference(mContext);
resetPreference.setTitle("Reset to Defaults");
resetPreference.setSelectable(true);
resetPreference.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
@Override
public boolean onPreferenceClick(Preference preference)
{
resetAllPreferencesToDefaults();
return true;
}
});
return resetPreference;
}
private void resetAllPreferencesToDefaults()
{
mPreferences.edit()
.clear()
.commit();
PreferenceManager.setDefaultValues(mContext, R.xml.preferences, true);
Toast.makeText(mContext, "Preferences cleared\nRestart activity to see values", Toast.LENGTH_SHORT).show();
}
/**
* Used for a debug preference, doesn't do error-handling, DON'T USE FOR PRODUCTION.
*
*/
private static class EditIntPreference extends EditTextPreference
{
public EditIntPreference(Context context)
{
super(context);
init(context, null, 0);
}
public EditIntPreference(Context context, AttributeSet attrs)
{
super(context, attrs);
init(context, attrs, 0);
}
public EditIntPreference(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle)
{
if (!BuildConfig.DEBUG)
{
throw new RuntimeException("EditIntPreference is not release-ready!");
}
}
@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue)
{
if (defaultValue != null)
{
defaultValue = defaultValue.toString();
}
super.onSetInitialValue(restoreValue, defaultValue);
}
@Override
protected String getPersistedString(String defaultReturnValue)
{
int defaultInt = 0;
if (defaultReturnValue != null)
{
defaultInt = Integer.parseInt(defaultReturnValue);
}
return String.valueOf(getPersistedInt(defaultInt));
}
@Override
protected boolean persistString(String value)
{
return persistInt(Integer.parseInt(value));
}
}
}