diff --git a/app/build.gradle b/app/build.gradle
index 681545403..b4852bccb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -114,7 +114,7 @@ task copyI2PResources(type: Copy) {
outputs.upToDateWhen { false }
into 'src/main/res'
into('drawable') {
- from file(i2pbase + '/installer/resources/themes/console/images/i2plogo.png')
+ from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/i2plogo.png')
}
into('raw') {
from(i2pbase + '/installer/resources/blocklist.txt') { rename { 'blocklist_txt' } }
@@ -177,15 +177,15 @@ task copyI2PAssets(type: Copy) {
outputs.upToDateWhen { false }
into 'src/main/assets/themes/console'
into('images') {
- from file(i2pbase + '/installer/resources/themes/console/images/i2plogo.png')
- from file(i2pbase + '/installer/resources/themes/console/images/inbound.png')
- from file(i2pbase + '/installer/resources/themes/console/images/outbound.png')
+ from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/i2plogo.png')
+ from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/inbound.png')
+ from file(i2pbase + '/apps/routerconsole/jsp/themes/console/images/outbound.png')
}
into('light') {
- from file(i2pbase + '/installer/resources/themes/console/light/console.css')
+ from file(i2pbase + '/apps/routerconsole/jsp/themes/console/light/console.css')
}
into('light/images') {
- from file(i2pbase + '/installer/resources/themes/console/light/images/header.png')
+ from file(i2pbase + '/apps/routerconsole/jsp/themes/console/light/images/header.png')
}
}
diff --git a/app/src/main/java/net/i2p/android/InitActivities.java b/app/src/main/java/net/i2p/android/InitActivities.java
index 9f4ca8fcc..0aea7ed03 100644
--- a/app/src/main/java/net/i2p/android/InitActivities.java
+++ b/app/src/main/java/net/i2p/android/InitActivities.java
@@ -92,7 +92,7 @@ class InitActivities {
File docsDir = new File(myDir, "docs");
docsDir.mkdir();
- copyResourceToFile(R.raw.ahelper_conflict_header_ht, "docs/ahelper-conflict-header.ht");
+ /*copyResourceToFile(R.raw.ahelper_conflict_header_ht, "docs/ahelper-conflict-header.ht");
copyResourceToFile(R.raw.ahelper_new_header_ht, "docs/ahelper-new-header.ht");
copyResourceToFile(R.raw.ahelper_notfound_header_ht, "docs/ahelper-notfound-header.ht");
copyResourceToFile(R.raw.auth_header_ht, "docs/auth-header.ht");
@@ -110,7 +110,7 @@ class InitActivities {
copyResourceToFile(R.raw.noproxy_header_ht, "docs/noproxy-header.ht");
copyResourceToFile(R.raw.protocol_header_ht, "docs/protocol-header.ht");
copyResourceToFile(R.raw.reset_header_ht, "docs/reset-header.ht");
- copyResourceToFile(R.raw.resetp_header_ht, "docs/resetp-header.ht");
+ copyResourceToFile(R.raw.resetp_header_ht, "docs/resetp-header.ht");*/
File cssDir = new File(docsDir, "themes/console/light");
cssDir.mkdirs();
diff --git a/app/src/main/java/net/i2p/android/router/service/LoadClientsJob.java b/app/src/main/java/net/i2p/android/router/service/LoadClientsJob.java
index cadb9bc4c..bd968a004 100644
--- a/app/src/main/java/net/i2p/android/router/service/LoadClientsJob.java
+++ b/app/src/main/java/net/i2p/android/router/service/LoadClientsJob.java
@@ -14,8 +14,11 @@ import net.i2p.router.JobImpl;
import net.i2p.router.RouterContext;
import net.i2p.router.startup.RouterAppManager;
import net.i2p.util.I2PAppThread;
+import net.i2p.sam.SAMBridge;
+import java.io.File;
import java.io.IOException;
+import java.util.Properties;
/**
* Load the clients we want.
@@ -41,6 +44,7 @@ class LoadClientsJob extends JobImpl {
private final Context mCtx;
private final Notifications _notif;
private DaemonThread _addressbook;
+ public SAMBridge SAM_BRIDGE;
//private BOB _bob;
/** this is the delay to load (and start) the clients. */
@@ -57,8 +61,9 @@ class LoadClientsJob extends JobImpl {
public String getName() { return "Start Clients"; }
public void runJob() {
- Job j = new RunI2PTunnel(getContext());
- getContext().jobQueue().addJob(j);
+ Job jtunnel = new RunI2PTunnel(getContext());
+ getContext().jobQueue().addJob(jtunnel);
+
Thread t = new I2PAppThread(new StatSummarizer(), "StatSummarizer", true);
t.setPriority(Thread.NORM_PRIORITY - 1);
@@ -69,7 +74,16 @@ class LoadClientsJob extends JobImpl {
//try {
// _bob.startup();
//} catch (IOException ioe) {}
-
+ String useSAM = System.getProperty("i2pandroid.client.sam");
+ if (useSAM != null) {
+ Util.i("SAM API " + useSAM);
+ if (useSAM == "true") {
+ Job jsam = new RunI2PSAM(getContext());
+ getContext().jobQueue().addJob(jsam);
+ }else{
+ Util.i("SAM API disabled, not starting "+useSAM);
+ }
+ }
getContext().addShutdownTask(new ClientShutdownHook());
}
@@ -112,6 +126,46 @@ class LoadClientsJob extends JobImpl {
}
}
+ private class RunI2PSAM extends JobImpl {
+
+ public RunI2PSAM(RouterContext ctx) {
+ super(ctx);
+ }
+
+ public String getName() { return "Start SAM API"; }
+
+ public void runJob() {
+ while (!getContext().router().isRunning()) {
+ try { Thread.sleep(1000); } catch (InterruptedException ie) { return; }
+ if (!getContext().router().isAlive()) {
+ Util.e("Router stopped before SAM API could start");
+ return;
+ }
+ }
+ Util.d("Starting SAM");
+ try {
+ Util.i("Starting the SAM API");
+ SAM_BRIDGE = new SAMBridge("127.0.0.1",
+ 7656,
+ false,
+ SAM_PROPERTIES(),
+ "sam.keys",
+ new File("sam_config"));
+ SAM_BRIDGE.startup();
+ } catch (IOException e) {
+ Util.e( e.toString());
+ e.printStackTrace();
+ }
+
+ }
+
+ public Properties SAM_PROPERTIES() throws IOException {
+ Util.i("Getting the default properties");
+ Properties sam_properties = new Properties();
+ return sam_properties;
+ }
+ }
+
private class ClientShutdownHook implements Runnable {
public void run() {
Util.d("client shutdown hook");
diff --git a/app/src/main/res/drawable/i2plogo.png b/app/src/main/res/drawable/i2plogo.png
index 0e1c13407..7b74bd147 100644
Binary files a/app/src/main/res/drawable/i2plogo.png and b/app/src/main/res/drawable/i2plogo.png differ
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f70aa9efe..c283993e3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -182,7 +182,9 @@
Transports
Max connections
I2CP interface
- Allow third-party apps to create tunnels (requires router restart)
+ Allow third-party apps to create tunnels using I2CP (requires router restart)
+ SAM interface
+ Allow third-party apps to create tunnels using SAM (requires router restart)
Exploratory pool
Tunnel parameters
Inbound tunnels
diff --git a/app/src/main/res/xml/settings_advanced.xml b/app/src/main/res/xml/settings_advanced.xml
index a02ee6143..ce2ec892d 100644
--- a/app/src/main/res/xml/settings_advanced.xml
+++ b/app/src/main/res/xml/settings_advanced.xml
@@ -23,6 +23,13 @@
android:summary="@string/settings_desc_i2cp"
/>
+
+
-
+
-
-
-
-
-
+
+
+
+
+
diff --git a/gradle.properties b/gradle.properties
index eebd55135..27f2f2cc0 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -14,7 +14,7 @@ POM_DEVELOPER_ID=idk
POM_DEVELOPER_NAME=idk
POM_DEVELOPER_EMAIL=hankhill19580@gmail.com
-I2P_VERSION=0.9.48
-ANDROID_BUILD_TARGET_SDK_VERSION=28
+I2P_VERSION=0.9.48-13
+ANDROID_BUILD_TARGET_SDK_VERSION=29
ANDROID_BUILD_SDK_VERSION=28
diff --git a/routerjars/build.gradle b/routerjars/build.gradle
index 43ded1e0d..fa1959f3b 100644
--- a/routerjars/build.gradle
+++ b/routerjars/build.gradle
@@ -13,6 +13,7 @@ artifacts {
routerjars file: file('libs/i2ptunnel.jar'), builtBy: buildRouter
routerjars file: file('libs/i2ptunnel-ui.jar'), builtBy: buildRouter
routerjars file: file('libs/addressbook.jar'), builtBy: buildRouter
+ routerjars file: file('libs/sam.jar'), builtBy: buildRouter
//routerjars file: file('libs/BOB.jar'), builtBy: buildRouter
}
clean.dependsOn cleanBuildRouter
diff --git a/routerjars/build.xml b/routerjars/build.xml
index e22da6270..be6f79426 100644
--- a/routerjars/build.xml
+++ b/routerjars/build.xml
@@ -20,6 +20,7 @@
+
@@ -36,7 +37,11 @@
-
+
+
+
+
+
@@ -50,10 +55,15 @@
-
+
+
+
+