diff --git a/.classpath b/.classpath index 179db62..5cf21e0 100644 --- a/.classpath +++ b/.classpath @@ -8,5 +8,6 @@ + diff --git a/botejars/custom_rules.xml b/botejars/custom_rules.xml index 77e52d6..6731e12 100644 --- a/botejars/custom_rules.xml +++ b/botejars/custom_rules.xml @@ -59,6 +59,9 @@ + + + diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 9d0f4ce..27a6f60 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -6,4 +6,14 @@ 2 3 + + internal + android + remote + + + Internal + I2P Android + Remote I2P router + diff --git a/res/xml/settings_general.xml b/res/xml/settings_general.xml index 0d76895..1ea09b2 100644 --- a/res/xml/settings_general.xml +++ b/res/xml/settings_general.xml @@ -53,17 +53,16 @@ android:summary="@string/pref_summ_maxDelay" android:title="@string/pref_title_maxDelay" /> - - - + + \ No newline at end of file diff --git a/src/i2p/bote/android/EmailListActivity.java b/src/i2p/bote/android/EmailListActivity.java index 5b55bfe..f1054fb 100644 --- a/src/i2p/bote/android/EmailListActivity.java +++ b/src/i2p/bote/android/EmailListActivity.java @@ -307,11 +307,6 @@ public class EmailListActivity extends ActionBarActivity implements System.setProperty("i2p.dir.base", myDir); System.setProperty("i2p.dir.config", myDir); System.setProperty("wrapper.logfile", myDir + "/wrapper.log"); - - // Set the I2CP host/port - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); - System.setProperty(I2PClient.PROP_TCP_HOST, prefs.getString("i2pbote.i2cp.tcp.host", "127.0.0.1")); - System.setProperty(I2PClient.PROP_TCP_PORT, prefs.getString("i2pbote.i2cp.tcp.port", "7654")); } } diff --git a/src/i2p/bote/android/config/SettingsActivity.java b/src/i2p/bote/android/config/SettingsActivity.java index 8ee97e3..6d849b8 100644 --- a/src/i2p/bote/android/config/SettingsActivity.java +++ b/src/i2p/bote/android/config/SettingsActivity.java @@ -3,6 +3,7 @@ package i2p.bote.android.config; import i2p.bote.Configuration; import i2p.bote.I2PBote; import i2p.bote.android.R; +import i2p.bote.android.util.SummaryEditTextPreference; import i2p.bote.email.EmailIdentity; import i2p.bote.fileencryption.PasswordException; @@ -21,7 +22,12 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.EditTextPreference; +import android.preference.ListPreference; +import android.preference.Preference; import android.preference.PreferenceActivity; +import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.view.LayoutInflater; @@ -207,10 +213,102 @@ public class SettingsActivity extends PreferenceActivity { String settings = getArguments().getString("settings"); if ("general".equals(settings)) { addPreferencesFromResource(R.xml.settings_general); + + final PreferenceCategory i2pCat = (PreferenceCategory)findPreference("i2pCategory"); + CheckBoxPreference routerAuto = (CheckBoxPreference)findPreference("i2pbote.router.auto"); + + if (!routerAuto.isChecked()) { + setupI2PCategory(getActivity(), i2pCat); + } + + routerAuto.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference preference, Object newValue) { + final Boolean checked = (Boolean) newValue; + if (!checked.booleanValue()) { + setupI2PCategory(getActivity(), i2pCat); + } else { + Preference p1 = i2pCat.findPreference("i2pbote.router.use"); + Preference p2 = i2pCat.findPreference("i2pbote.i2cp.tcp.host"); + Preference p3 = i2pCat.findPreference("i2pbote.i2cp.tcp.port"); + if (p1 != null) + i2pCat.removePreference(p1); + if (p2 != null) + i2pCat.removePreference(p2); + if (p3 != null) + i2pCat.removePreference(p3); + } + return true; + } + }); } } } + private static void setupI2PCategory(Context context, PreferenceCategory i2pCat) { + final ListPreference routerChoice = createRouterChoice(context); + final EditTextPreference hostField = createHostField(context); + final EditTextPreference portField = createPortField(context); + i2pCat.addPreference(routerChoice); + i2pCat.addPreference(hostField); + i2pCat.addPreference(portField); + + if ("remote".equals(routerChoice.getValue())) { + hostField.setEnabled(true); + portField.setEnabled(true); + } + + routerChoice.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference preference, Object newValue) { + final String val = newValue.toString(); + int index = routerChoice.findIndexOfValue(val); + if (index == 2) { + hostField.setEnabled(true); + hostField.setText("127.0.0.1"); + portField.setEnabled(true); + portField.setText("7654"); + } else { + hostField.setEnabled(false); + hostField.setText("internal"); + portField.setEnabled(false); + portField.setText("internal"); + } + return true; + } + }); + } + + private static ListPreference createRouterChoice(Context context) { + ListPreference routerChoice = new ListPreference(context); + routerChoice.setKey("i2pbote.router.use"); + routerChoice.setEntries(R.array.routerOptionNames); + routerChoice.setEntryValues(R.array.routerOptions); + routerChoice.setTitle("Router"); + routerChoice.setSummary("%s"); + routerChoice.setDialogTitle("Router to use"); + routerChoice.setDefaultValue("internal"); + return routerChoice; + } + + private static EditTextPreference createHostField(Context context) { + EditTextPreference p = new SummaryEditTextPreference(context); + p.setKey("i2pbote.i2cp.tcp.host"); + p.setTitle(R.string.pref_title_i2cp_host); + p.setSummary("%s"); + p.setDefaultValue("internal"); + p.setEnabled(false); + return p; + } + + private static EditTextPreference createPortField(Context context) { + EditTextPreference p = new SummaryEditTextPreference(context); + p.setKey("i2pbote.i2cp.tcp.port"); + p.setTitle(R.string.pref_title_i2cp_port); + p.setSummary("%s"); + p.setDefaultValue("internal"); + p.setEnabled(false); + return p; + } + // // Update list of identities in headers diff --git a/src/i2p/bote/android/service/BoteService.java b/src/i2p/bote/android/service/BoteService.java index 3018ca0..5d8aa2b 100644 --- a/src/i2p/bote/android/service/BoteService.java +++ b/src/i2p/bote/android/service/BoteService.java @@ -1,13 +1,26 @@ package i2p.bote.android.service; +import java.util.List; + +import net.i2p.router.Router; +import net.i2p.router.RouterContext; +import net.i2p.router.RouterLaunch; import i2p.bote.I2PBote; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class BoteService extends Service { + boolean mUseInternalRouter; + RouterContext mRouterContext; + @Override public int onStartCommand(Intent intent, int flags, int startId) { + // Init from settings + Init init = new Init(this); + mUseInternalRouter = init.initialize(); + if (mUseInternalRouter) + new Thread(new RouterStarter()).start(); I2PBote.getInstance().startUp(); return START_STICKY; } @@ -20,5 +33,24 @@ public class BoteService extends Service { @Override public void onDestroy() { I2PBote.getInstance().shutDown(); + if (mUseInternalRouter) + new Thread(new RouterStopper()).start(); + } + + private class RouterStarter implements Runnable { + public void run() { + RouterLaunch.main(null); + List contexts = RouterContext.listContexts(); + mRouterContext = contexts.get(0); + mRouterContext.router().setKillVMOnEnd(false); + } + } + + private class RouterStopper implements Runnable { + public void run() { + RouterContext ctx = mRouterContext; + if (ctx != null) + ctx.router().shutdown(Router.EXIT_HARD); + } } }