package com.zachklipp.captivate.app;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceCategory;
import android.preference.PreferenceGroup;
import com.zachklipp.captivate.BuildConfig;
import com.zachklipp.captivate.Preferences;
import com.zachklipp.captivate.R;
import com.zachklipp.captivate.service.PortalDetectorService;
import com.zachklipp.captivate.util.Log;
import com.zachklipp.captivate.util.SafeIntentSender;
import com.zachklipp.captivate.util.StringHelper;
@SuppressWarnings("deprecation")
public class PreferenceActivity extends android.preference.PreferenceActivity
{
private static final int DIALOG_NO_FEEDBACK_RECEIVER = 0;
private static final IntentFilter sDebugIntentFilter = new IntentFilter(
PortalDetectorService.ACTION_PORTAL_STATE_CHANGED);
private final BroadcastReceiver mDebugReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(PortalDetectorService.ACTION_PORTAL_STATE_CHANGED))
{
if (mDebugStatePreference != null)
{
mDebugStatePreference.setSummary(
intent.getStringExtra(PortalDetectorService.EXTRA_PORTAL_STATE));
}
}
}
};
private Preference mDebugStatePreference;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
CheckBoxPreference enabledPref = (CheckBoxPreference)
getPreferenceManager().findPreference(Preferences.ENABLED_KEY);
enabledPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener()
{
@Override
public boolean onPreferenceChange(Preference preference, Object newValue)
{
startService(new Intent(PreferenceActivity.this, PortalDetectorService.class));
return true;
}
});
if (BuildConfig.DEBUG)
{
createDebugPreferences(getPreferenceScreen());
registerReceiver(mDebugReceiver, sDebugIntentFilter);
}
formatStrings();
initializeFeedbackIntent();
}
@Override
public void onDestroy()
{
super.onDestroy();
if (BuildConfig.DEBUG)
{
unregisterReceiver(mDebugReceiver);
}
}
@Override
protected Dialog onCreateDialog(int which)
{
Dialog dialog = null;
switch (which)
{
case DIALOG_NO_FEEDBACK_RECEIVER:
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setMessage(getString(
R.string.no_feedback_receiver_message, getString(R.string.feedback_email)))
.setNeutralButton(R.string.ok, null);
dialog = builder.create();
break;
default:
Log.w("Attempted to show invalid dialog: %d", which);
}
return dialog;
}
private void formatStrings()
{
formatPreferenceTitle(Preferences.FEEDBACK_KEY, R.string.feedback_email);
formatPreferenceTitle(Preferences.ABOUT_KEY, R.string.app_name);
CheckBoxPreference enabledPref = (CheckBoxPreference)
getPreferenceManager().findPreference(Preferences.ENABLED_KEY);
enabledPref.setSummaryOn(StringHelper.formatWithResourceStrings(
this, enabledPref.getSummaryOn(), R.string.app_name));
enabledPref.setSummaryOff(StringHelper.formatWithResourceStrings(
this, enabledPref.getSummaryOff(), R.string.app_name));
}
private void initializeFeedbackIntent()
{
Preference feedbackPreference = getPreferenceScreen().findPreference(
Preferences.FEEDBACK_KEY);
Intent primaryIntent = feedbackPreference.getIntent();
final SafeIntentSender sender = new SafeIntentSender(this);
primaryIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
getString(R.string.feedback_subject, getString(R.string.app_name)));
primaryIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
new String[] {getString(R.string.feedback_email)});
sender.setNoReceiverHandler(new SafeIntentSender.OnNoReceiverListener()
{
@Override
public void onNoReceiver(Intent primary)
{
// Can't use DialogFragment since there's no such thing as
// SherlockPreferenceFragmentActivity.
showDialog(DIALOG_NO_FEEDBACK_RECEIVER);
}
});
feedbackPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference)
{
sender.startActivity(preference.getIntent());
return true;
}
});
}
private void formatPreferenceTitle(CharSequence key, int... args)
{
Preference pref = getPreferenceManager().findPreference(key);
pref.setTitle(StringHelper.formatWithResourceStrings(this, pref.getTitle(), args));
}
private void createDebugPreferences(PreferenceGroup parent)
{
PreferenceCategory debugCategory = new PreferenceCategory(this);
debugCategory.setTitle("Debug");
parent.addPreference(debugCategory);
mDebugStatePreference = new Preference(this);
mDebugStatePreference.setTitle("Portal state (tap to refresh)");
mDebugStatePreference.setSelectable(true);
mDebugStatePreference.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
@Override
public boolean onPreferenceClick(Preference preference)
{
PortalDetectorService.startService(PreferenceActivity.this);
return true;
}
});
debugCategory.addPreference(mDebugStatePreference);
Preferences preferences = Preferences.getPreferences(this);
debugCategory.addPreference(preferences.getSigninCheckSecondsPreference());
debugCategory.addPreference(preferences.getDebugOverridePreference());
debugCategory.addPreference(preferences.getResetToDefaultsPreference());
}
}