package net.i2p.android.i2ptunnel.preferences;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.preference.CheckBoxPreference;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
import net.i2p.android.i2ptunnel.util.TunnelLogic;
import net.i2p.android.i2ptunnel.util.TunnelUtil;
import net.i2p.android.router.R;
import net.i2p.util.Addresses;
import java.util.Set;
public class GeneralTunnelPreferenceFragment extends BaseTunnelPreferenceFragment {
private CheckBoxPreference persistentKeys;
public static GeneralTunnelPreferenceFragment newInstance(int tunnelId) {
GeneralTunnelPreferenceFragment f = new GeneralTunnelPreferenceFragment();
Bundle args = new Bundle();
args.putInt(ARG_TUNNEL_ID, tunnelId);
f.setArguments(args);
return f;
}
@Override
protected void loadPreferences() {
String type = TunnelUtil.getController(mGroup, mTunnelId).getType();
new TunnelPreferences(type).runLogic();
}
@Override
public void onStart() {
super.onStart();
// In case this was changed when toggling NEW_KEYS and then we navigated back
if (persistentKeys != null)
persistentKeys.setChecked(getPreferenceManager().getSharedPreferences().getBoolean(
getString(R.string.TUNNEL_OPT_PERSISTENT_KEY),
getResources().getBoolean(R.bool.DEFAULT_PERSISTENT_KEY)
));
}
class TunnelPreferences extends TunnelLogic {
PreferenceScreen ps;
PreferenceCategory generalCategory;
PreferenceCategory portCategory;
public TunnelPreferences(String type) {
super(type);
}
@Override
protected void general() {
addPreferencesFromResource(R.xml.tunnel_gen);
ps = getPreferenceScreen();
generalCategory = (PreferenceCategory) ps.findPreference(
getString(R.string.TUNNEL_CAT_GENERAL));
portCategory = (PreferenceCategory) ps.findPreference(
getString(R.string.TUNNEL_CAT_PORT));
}
@Override
protected void generalClient() {
addPreferencesFromResource(R.xml.tunnel_gen_client, generalCategory);
// PERSISTENT_KEY and NEW_KEYS can't be set simultaneously
persistentKeys = (CheckBoxPreference) findPreference(getString(R.string.TUNNEL_OPT_PERSISTENT_KEY));
persistentKeys.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
if ((Boolean) o && prefs.getBoolean(getString(R.string.TUNNEL_OTP_NEW_KEYS),
getResources().getBoolean(R.bool.DEFAULT_NEW_KEYS))) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.persistent_key_conflict_title)
.setMessage(R.string.persistent_key_conflict_msg)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(getString(R.string.TUNNEL_OTP_NEW_KEYS), false);
editor.apply();
persistentKeys.setChecked(true);
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
return false;
} else
return true;
}
});
}
@Override
protected void generalClientStreamr(boolean isStreamr) {
if (isStreamr) {
generalCategory.removePreference(generalCategory.findPreference(getString(R.string.TUNNEL_SHARED_CLIENT)));
addPreferencesFromResource(R.xml.tunnel_gen_server_port, portCategory);
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_TARGET_PORT)));
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
}
}
@Override
protected void generalClientPort() {
addPreferencesFromResource(R.xml.tunnel_gen_client_port, portCategory);
}
@Override
protected void generalClientPortStreamr(boolean isStreamr) {
ListPreference reachableBy = (ListPreference) portCategory.findPreference(getString(R.string.TUNNEL_INTERFACE));
if (isStreamr)
portCategory.removePreference(reachableBy);
else
setupReachableBy(reachableBy);
}
private void setupReachableBy(final ListPreference reachableBy) {
reachableBy.setEnabled(false);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
Set<String> interfaceSet = Addresses.getAllAddresses();
final String[] interfaces = interfaceSet.toArray(new String[interfaceSet.size()]);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
reachableBy.setEntries(interfaces);
reachableBy.setEntryValues(interfaces);
reachableBy.setEnabled(true);
}
});
return null;
}
}.execute();
}
@Override
protected void generalClientProxy(boolean isProxy) {
if (isProxy) {
generalCategory.removePreference(generalCategory.findPreference(getString(R.string.TUNNEL_DEST)));
addPreferencesFromResource(R.xml.tunnel_gen_client_proxy);
}
}
@Override
protected void generalClientProxyHttp(boolean isHttp) {
if (!isHttp)
ps.removePreference(ps.findPreference(getString(R.string.TUNNEL_HTTPCLIENT_SSL_OUTPROXIES)));
}
@Override
protected void generalClientStandardOrIrc(boolean isStandardOrIrc) {
if (!isStandardOrIrc)
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
}
@Override
protected void generalClientIrc() {
addPreferencesFromResource(R.xml.tunnel_gen_client_irc);
}
@Override
protected void generalServerHttp() {
addPreferencesFromResource(R.xml.tunnel_gen_server_http, generalCategory);
}
@Override
protected void generalServerHttpBidirOrStreamr(boolean isStreamr) {
addPreferencesFromResource(R.xml.tunnel_gen_client_port, portCategory);
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
if (isStreamr)
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_LISTEN_PORT)));
setupReachableBy((ListPreference) portCategory.findPreference(getString(R.string.TUNNEL_INTERFACE)));
}
@Override
protected void generalServerPort() {
addPreferencesFromResource(R.xml.tunnel_gen_server_port, portCategory);
}
@Override
protected void generalServerPortStreamr(boolean isStreamr) {
if (isStreamr) {
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_TARGET_HOST)));
portCategory.removePreference(portCategory.findPreference(getString(R.string.TUNNEL_USE_SSL)));
}
}
@Override
protected void advanced() {
Preference advanced = new Preference(getActivity());
advanced.setKey(getString(R.string.TUNNEL_CAT_ADVANCED));
advanced.setTitle(R.string.settings_label_advanced);
advanced.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Fragment fragment = AdvancedTunnelPreferenceFragment.newInstance(mTunnelId);
getFragmentManager().beginTransaction()
.replace(R.id.fragment, fragment)
.addToBackStack(null)
.commit();
return true;
}
});
ps.addPreference(advanced);
}
@Override
protected void advancedStreamr(boolean isStreamr) {
}
@Override
protected void advancedServerOrStreamrClient(boolean isServerOrStreamrClient) {
}
@Override
protected void advancedServer() {
}
@Override
protected void advancedServerHttp(boolean isHttp) {
}
@Override
protected void advancedIdle() {
}
@Override
protected void advancedIdleServerOrStreamrClient(boolean isServerOrStreamrClient) {
}
@Override
protected void advancedClient() {
}
@Override
protected void advancedClientHttp() {
}
@Override
protected void advancedClientProxy() {
}
@Override
protected void advancedOther() {
}
}
}