Compare commits
19 Commits
android-cl
...
android-0.
Author | SHA1 | Date | |
---|---|---|---|
6b585822f1 | |||
c81c57daa0 | |||
f28be9cb02 | |||
6582f67ed5 | |||
d138c482d9 | |||
fc2d962cad | |||
c541ae0347 | |||
d6e79ed0a7 | |||
7ec20fe60c | |||
f3464c5095 | |||
32512fecbc | |||
1d7fcd47ef | |||
f156c591ad | |||
fb6ca0d61e | |||
a4662984a7 | |||
6cccf1fb23 | |||
39f32acd5b | |||
3d60d10f8e | |||
8cbc11dff0 |
@ -4,6 +4,7 @@
|
|||||||
* Tunnels can now be edited
|
* Tunnels can now be edited
|
||||||
* Material design improvements
|
* Material design improvements
|
||||||
* Better support for tablets
|
* Better support for tablets
|
||||||
|
* Improved graph rendering
|
||||||
* Bug fixes and translation updates
|
* Bug fixes and translation updates
|
||||||
|
|
||||||
0.9.19.1 / 2015-04-15 / ed86e7e85161dbe3f15932fd4d195c551f8e2c71
|
0.9.19.1 / 2015-04-15 / ed86e7e85161dbe3f15932fd4d195c551f8e2c71
|
||||||
|
8
TODO
8
TODO
@ -6,12 +6,19 @@
|
|||||||
- Browser
|
- Browser
|
||||||
<zzzccc> Bug report: i2p browser treats 302 as an error
|
<zzzccc> Bug report: i2p browser treats 302 as an error
|
||||||
<zzzccc> Bug 2: rotate screen in i2p browser seems to go back one page
|
<zzzccc> Bug 2: rotate screen in i2p browser seems to go back one page
|
||||||
|
- Console text change
|
||||||
|
<zzz> "download" and "upload" at the bottom of the status is a little misleading..
|
||||||
|
<zzz> maybe 'downstream bandwidth' or 'inbound usage' ?
|
||||||
|
- Fix visibility of advanced tunnel parameter changes
|
||||||
|
<zzz> when I change an advanced tunnel param e.g. length or variance, the change isn't displayed, I have to go back and forward again to see the change
|
||||||
|
|
||||||
# New UI fixes
|
# New UI fixes
|
||||||
|
|
||||||
- Addressbook action items are in tunnel overflow menu after moving from console to tunnels
|
- Addressbook action items are in tunnel overflow menu after moving from console to tunnels
|
||||||
- Material design:
|
- Material design:
|
||||||
- Style for addressbook headers
|
- Style for addressbook headers
|
||||||
|
- Change console FAM icon when possible
|
||||||
|
<zzz> on the bottom right, the + and x icons might be better as a double-up arrow and double-down arrow?
|
||||||
|
|
||||||
# Short-term
|
# Short-term
|
||||||
|
|
||||||
@ -41,7 +48,6 @@
|
|||||||
- Also look at connection type: Connectivity.isConnectionFast()
|
- Also look at connection type: Connectivity.isConnectionFast()
|
||||||
- Expose log level overrides
|
- Expose log level overrides
|
||||||
- Improve graphs
|
- Improve graphs
|
||||||
- Show time on bottom axis
|
|
||||||
- Show fixed x range, not only available data
|
- Show fixed x range, not only available data
|
||||||
- Think about pan/zoom
|
- Think about pan/zoom
|
||||||
- How to persist data across restarts?
|
- How to persist data across restarts?
|
||||||
|
@ -5,8 +5,8 @@ android {
|
|||||||
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION as String)
|
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION as String)
|
||||||
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION as String
|
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION as String
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
versionCode 4745229
|
versionCode 4745230
|
||||||
versionName '0.9.19.1'
|
versionName '0.9.20'
|
||||||
minSdkVersion 9
|
minSdkVersion 9
|
||||||
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
|
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
|
||||||
|
|
||||||
@ -128,6 +128,24 @@ task copyI2PResources(type: Copy) {
|
|||||||
rename { String name ->
|
rename { String name ->
|
||||||
name.toLowerCase(Locale.US).replace('-', '_').replace('.', '_')
|
name.toLowerCase(Locale.US).replace('-', '_').replace('.', '_')
|
||||||
}
|
}
|
||||||
|
filter { String line ->
|
||||||
|
// Remove links to routerconsole
|
||||||
|
def m = line =~ /127.0.0.1:7657/
|
||||||
|
if (m.getCount()) {
|
||||||
|
// Links around content
|
||||||
|
line = line.replaceAll(/<a href="http:\/\/127.0.0.1:7657[^>]*>(.+?)<\/a>/) { fullmatch, content ->
|
||||||
|
content
|
||||||
|
}
|
||||||
|
// Links in translation substitutions
|
||||||
|
line = line.replaceAll(/"<a href=\\"http:\/\/127.0.0.1:7657[^>]*>", "<\/a>"/, '"", ""')
|
||||||
|
}
|
||||||
|
// Remove "Configuration - Help - Addressbook" heading
|
||||||
|
def n = line =~ /Configuration.+Help.+Addressbook/
|
||||||
|
if (n.getCount())
|
||||||
|
""
|
||||||
|
else
|
||||||
|
line
|
||||||
|
}
|
||||||
}
|
}
|
||||||
from('../LICENSE.txt') { rename { 'license_app_txt' } }
|
from('../LICENSE.txt') { rename { 'license_app_txt' } }
|
||||||
from('../licenses/LICENSE-Apache2.0.txt') { rename { 'license_apache20_txt' } }
|
from('../licenses/LICENSE-Apache2.0.txt') { rename { 'license_apache20_txt' } }
|
||||||
|
@ -5,14 +5,29 @@ import android.content.Context;
|
|||||||
import net.i2p.android.router.NewsActivity;
|
import net.i2p.android.router.NewsActivity;
|
||||||
import net.i2p.android.router.R;
|
import net.i2p.android.router.R;
|
||||||
import net.i2p.android.router.util.Notifications;
|
import net.i2p.android.router.util.Notifications;
|
||||||
|
import net.i2p.crypto.SU3File;
|
||||||
import net.i2p.data.DataHelper;
|
import net.i2p.data.DataHelper;
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.router.news.NewsEntry;
|
||||||
|
import net.i2p.router.news.NewsMetadata;
|
||||||
|
import net.i2p.router.news.NewsXMLParser;
|
||||||
import net.i2p.router.util.RFC822Date;
|
import net.i2p.router.util.RFC822Date;
|
||||||
import net.i2p.util.EepGet;
|
import net.i2p.util.EepGet;
|
||||||
import net.i2p.util.FileUtil;
|
import net.i2p.util.FileUtil;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
import net.i2p.util.ReusableGZIPInputStream;
|
||||||
|
import net.i2p.util.SecureFileOutputStream;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* From router console, simplified since we don't deal with router versions
|
* From router console, simplified since we don't deal with router versions
|
||||||
@ -50,18 +65,18 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
private static final String TEMP_NEWS_FILE = "news.xml.temp";
|
private static final String TEMP_NEWS_FILE = "news.xml.temp";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changed in 0.9.11 to the b32 for psi.i2p, run by psi.
|
* Changed in 0.9.11 to the b32 for psi.i2p, run by psi.
|
||||||
* We may be able to change it to psi.i2p in a future release after
|
* We may be able to change it to psi.i2p in a future release after
|
||||||
* the hostname propagates.
|
* the hostname propagates.
|
||||||
*
|
*
|
||||||
* @since 0.7.14 not configurable
|
* @since 0.7.14 not configurable
|
||||||
*/
|
*/
|
||||||
private static final String BACKUP_NEWS_URL = "http://avviiexdngd32ccoy4kuckvc3mkf53ycvzbz6vz75vzhv4tbpk5a.b32.i2p/news.xml";
|
private static final String BACKUP_NEWS_URL_SU3 = "http://avviiexdngd32ccoy4kuckvc3mkf53ycvzbz6vz75vzhv4tbpk5a.b32.i2p/news.su3";
|
||||||
private static final String PROP_LAST_CHECKED = "router.newsLastChecked";
|
private static final String PROP_LAST_CHECKED = "router.newsLastChecked";
|
||||||
private static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency";
|
private static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency";
|
||||||
private static final String DEFAULT_REFRESH_FREQUENCY = 24*60*60*1000 + "";
|
private static final String DEFAULT_REFRESH_FREQUENCY = 24 * 60 * 60 * 1000 + "";
|
||||||
private static final String PROP_NEWS_URL = "router.newsURL";
|
private static final String PROP_NEWS_URL = "router.newsURL";
|
||||||
private static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml";
|
public static final String DEFAULT_NEWS_URL_SU3 = "http://echelon.i2p/news/news.su3";
|
||||||
|
|
||||||
private NewsFetcher(Context context, RouterContext ctx, Notifications notif) {
|
private NewsFetcher(Context context, RouterContext ctx, Notifications notif) {
|
||||||
mCtx = context;
|
mCtx = context;
|
||||||
@ -73,7 +88,8 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
String last = ctx.getProperty(PROP_LAST_CHECKED);
|
String last = ctx.getProperty(PROP_LAST_CHECKED);
|
||||||
if (last != null)
|
if (last != null)
|
||||||
_lastFetch = Long.parseLong(last);
|
_lastFetch = Long.parseLong(last);
|
||||||
} catch (NumberFormatException nfe) {}
|
} catch (NumberFormatException nfe) {
|
||||||
|
}
|
||||||
File newsDir = new File(_context.getRouterDir(), NEWS_DIR);
|
File newsDir = new File(_context.getRouterDir(), NEWS_DIR);
|
||||||
// isn't already there on android
|
// isn't already there on android
|
||||||
newsDir.mkdir();
|
newsDir.mkdir();
|
||||||
@ -98,22 +114,24 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String status() {
|
public String status() {
|
||||||
StringBuilder buf = new StringBuilder(128);
|
StringBuilder buf = new StringBuilder(128);
|
||||||
long now = _context.clock().now();
|
long now = _context.clock().now();
|
||||||
if (_lastUpdated > 0) {
|
if (_lastUpdated > 0) {
|
||||||
buf.append(mCtx.getString(R.string.news_last_updated,
|
buf.append(mCtx.getString(R.string.news_last_updated,
|
||||||
DataHelper.formatDuration2(now - _lastUpdated)))
|
DataHelper.formatDuration2(now - _lastUpdated)))
|
||||||
.append('\n');
|
.append('\n');
|
||||||
}
|
}
|
||||||
if (_lastFetch > _lastUpdated) {
|
if (_lastFetch > _lastUpdated) {
|
||||||
buf.append(mCtx.getString(R.string.news_last_checked,
|
buf.append(mCtx.getString(R.string.news_last_checked,
|
||||||
DataHelper.formatDuration2(now - _lastFetch)));
|
DataHelper.formatDuration2(now - _lastFetch)));
|
||||||
}
|
}
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final long INITIAL_DELAY = 5*60*1000;
|
// Runnable
|
||||||
private static final long RUN_DELAY = 30*60*1000;
|
|
||||||
|
private static final long INITIAL_DELAY = 5 * 60 * 1000;
|
||||||
|
private static final long RUN_DELAY = 30 * 60 * 1000;
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
_thread = Thread.currentThread();
|
_thread = Thread.currentThread();
|
||||||
@ -139,7 +157,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
return true;
|
return true;
|
||||||
updateLastFetched();
|
updateLastFetched();
|
||||||
String freq = _context.getProperty(PROP_REFRESH_FREQUENCY,
|
String freq = _context.getProperty(PROP_REFRESH_FREQUENCY,
|
||||||
DEFAULT_REFRESH_FREQUENCY);
|
DEFAULT_REFRESH_FREQUENCY);
|
||||||
try {
|
try {
|
||||||
long ms = Long.parseLong(freq);
|
long ms = Long.parseLong(freq);
|
||||||
if (ms <= 0)
|
if (ms <= 0)
|
||||||
@ -160,8 +178,9 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call this when changing news URLs to force an update next time the timer fires.
|
* Call this when changing news URLs to force an update next time the timer fires.
|
||||||
* @since 0.8.7
|
*
|
||||||
|
* @since 0.8.7
|
||||||
*/
|
*/
|
||||||
void invalidateNews() {
|
void invalidateNews() {
|
||||||
_lastModified = null;
|
_lastModified = null;
|
||||||
@ -169,7 +188,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void fetchNews() {
|
public void fetchNews() {
|
||||||
String newsURL = _context.getProperty(PROP_NEWS_URL, DEFAULT_NEWS_URL);
|
String newsURL = _context.getProperty(PROP_NEWS_URL, DEFAULT_NEWS_URL_SU3);
|
||||||
String proxyHost = "127.0.0.1";
|
String proxyHost = "127.0.0.1";
|
||||||
int proxyPort = 4444;
|
int proxyPort = 4444;
|
||||||
if (_tempFile.exists())
|
if (_tempFile.exists())
|
||||||
@ -185,7 +204,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
} else {
|
} else {
|
||||||
// backup news location - always proxied
|
// backup news location - always proxied
|
||||||
_tempFile.delete();
|
_tempFile.delete();
|
||||||
get = new EepGet(_context, true, proxyHost, proxyPort, 0, _tempFile.getAbsolutePath(), BACKUP_NEWS_URL, true, null, _lastModified);
|
get = new EepGet(_context, true, proxyHost, proxyPort, 0, _tempFile.getAbsolutePath(), BACKUP_NEWS_URL_SU3, true, null, _lastModified);
|
||||||
get.addStatusListener(this);
|
get.addStatusListener(this);
|
||||||
if (get.fetch())
|
if (get.fetch())
|
||||||
_lastModified = get.getLastModified();
|
_lastModified = get.getLastModified();
|
||||||
@ -195,22 +214,34 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause) {
|
// EepGet.StatusListener
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {
|
public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
|
|
||||||
public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {
|
public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info("News fetched from " + url + " with " + (alreadyTransferred+bytesTransferred));
|
_log.info("News fetched from " + url + " with " + (alreadyTransferred + bytesTransferred));
|
||||||
|
|
||||||
long now = _context.clock().now();
|
long now = _context.clock().now();
|
||||||
if (_tempFile.exists()) {
|
if (_tempFile.exists() && _tempFile.length() > 0) {
|
||||||
boolean copied = FileUtil.copy(_tempFile.getAbsolutePath(), _newsFile.getAbsolutePath(), true);
|
File from;
|
||||||
|
if (url.endsWith(".su3")) {
|
||||||
|
try {
|
||||||
|
from = processSU3();
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
_log.error("Failed to extract the news file", ioe);
|
||||||
|
_tempFile.delete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
from = _tempFile;
|
||||||
|
}
|
||||||
|
boolean copied = FileUtil.rename(from, _newsFile);
|
||||||
|
_tempFile.delete();
|
||||||
if (copied) {
|
if (copied) {
|
||||||
_lastUpdated = now;
|
_lastUpdated = now;
|
||||||
_tempFile.delete();
|
|
||||||
|
|
||||||
// Notify user
|
// Notify user
|
||||||
_notif.notify(mCtx.getString(R.string.news_updated),
|
_notif.notify(mCtx.getString(R.string.news_updated),
|
||||||
@ -229,13 +260,21 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
_context.router().saveConfig();
|
_context.router().saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
|
||||||
public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {
|
public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {
|
||||||
if (_log.shouldLog(Log.WARN))
|
if (_log.shouldLog(Log.WARN))
|
||||||
_log.warn("Failed to fetch the news from " + url);
|
_log.warn("Failed to fetch the news from " + url);
|
||||||
_tempFile.delete();
|
_tempFile.delete();
|
||||||
}
|
}
|
||||||
public void headerReceived(String url, int attemptNum, String key, String val) {}
|
|
||||||
public void attempting(String url) {}
|
public void headerReceived(String url, int attemptNum, String key, String val) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void attempting(String url) {
|
||||||
|
}
|
||||||
|
|
||||||
private class Shutdown implements Runnable {
|
private class Shutdown implements Runnable {
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -244,4 +283,138 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
|
|||||||
_thread.interrupt();
|
_thread.interrupt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// SU3 handlers
|
||||||
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the fetched su3 news file _tempFile.
|
||||||
|
* Handles 3 types of contained files: xml.gz (preferred), xml, and html (old format fake xml)
|
||||||
|
*
|
||||||
|
* @return the temp file contining the HTML-format news.xml
|
||||||
|
* @since 0.9.20
|
||||||
|
*/
|
||||||
|
private File processSU3() throws IOException {
|
||||||
|
SU3File su3 = new SU3File(_context, _tempFile);
|
||||||
|
// real xml, maybe gz, maybe not
|
||||||
|
File to1 = new File(_context.getTempDir(), "tmp-" + _context.random().nextInt() + ".xml");
|
||||||
|
// real xml
|
||||||
|
File to2 = new File(_context.getTempDir(), "tmp2-" + _context.random().nextInt() + ".xml");
|
||||||
|
try {
|
||||||
|
su3.verifyAndMigrate(to1);
|
||||||
|
int type = su3.getFileType();
|
||||||
|
if (su3.getContentType() != SU3File.CONTENT_NEWS)
|
||||||
|
throw new IOException("bad content type: " + su3.getContentType());
|
||||||
|
if (type == SU3File.TYPE_HTML)
|
||||||
|
return to1;
|
||||||
|
if (type != SU3File.TYPE_XML && type != SU3File.TYPE_XML_GZ)
|
||||||
|
throw new IOException("bad file type: " + type);
|
||||||
|
File xml;
|
||||||
|
if (type == SU3File.TYPE_XML_GZ) {
|
||||||
|
gunzip(to1, to2);
|
||||||
|
xml = to2;
|
||||||
|
to1.delete();
|
||||||
|
} else {
|
||||||
|
xml = to1;
|
||||||
|
}
|
||||||
|
NewsXMLParser parser = new NewsXMLParser(_context);
|
||||||
|
parser.parse(xml);
|
||||||
|
xml.delete();
|
||||||
|
NewsMetadata data = parser.getMetadata();
|
||||||
|
List<NewsEntry> entries = parser.getEntries();
|
||||||
|
String sudVersion = su3.getVersionString();
|
||||||
|
String signingKeyName = su3.getSignerString();
|
||||||
|
File to3 = new File(_context.getTempDir(), "tmp3-" + _context.random().nextInt() + ".xml");
|
||||||
|
outputOldNewsXML(data, entries, sudVersion, signingKeyName, to3);
|
||||||
|
return to3;
|
||||||
|
} finally {
|
||||||
|
to2.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gunzip the file
|
||||||
|
*
|
||||||
|
* @since 0.9.20
|
||||||
|
*/
|
||||||
|
private static void gunzip(File from, File to) throws IOException {
|
||||||
|
ReusableGZIPInputStream in = ReusableGZIPInputStream.acquire();
|
||||||
|
OutputStream out = null;
|
||||||
|
try {
|
||||||
|
in.initialize(new FileInputStream(from));
|
||||||
|
out = new SecureFileOutputStream(to);
|
||||||
|
byte buf[] = new byte[4096];
|
||||||
|
int read;
|
||||||
|
while ((read = in.read(buf)) != -1) {
|
||||||
|
out.write(buf, 0, read);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (out != null) try {
|
||||||
|
out.close();
|
||||||
|
} catch (IOException ioe) {}
|
||||||
|
ReusableGZIPInputStream.release(in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Output in the old format.
|
||||||
|
*
|
||||||
|
* @since 0.9.20
|
||||||
|
*/
|
||||||
|
private void outputOldNewsXML(NewsMetadata data, List<NewsEntry> entries,
|
||||||
|
String sudVersion, String signingKeyName, File to) throws IOException {
|
||||||
|
NewsMetadata.Release latestRelease = data.releases.get(0);
|
||||||
|
Writer out = null;
|
||||||
|
try {
|
||||||
|
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(to), "UTF-8"));
|
||||||
|
out.write("<!--\n");
|
||||||
|
// update metadata in old format
|
||||||
|
out.write("<i2p.release ");
|
||||||
|
if (latestRelease.i2pVersion != null)
|
||||||
|
out.write(" version=\"" + latestRelease.i2pVersion + '"');
|
||||||
|
if (latestRelease.minVersion != null)
|
||||||
|
out.write(" minVersion=\"" + latestRelease.minVersion + '"');
|
||||||
|
if (latestRelease.minJavaVersion != null)
|
||||||
|
out.write(" minJavaVersion=\"" + latestRelease.minJavaVersion + '"');
|
||||||
|
String su3Torrent = "";
|
||||||
|
String su2Torrent = "";
|
||||||
|
for (NewsMetadata.Update update : latestRelease.updates) {
|
||||||
|
if (update.torrent != null) {
|
||||||
|
if ("su3".equals(update.type))
|
||||||
|
su3Torrent = update.torrent;
|
||||||
|
else if ("su2".equals(update.type))
|
||||||
|
su2Torrent = update.torrent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!su2Torrent.isEmpty())
|
||||||
|
out.write(" su2Torrent=\"" + su2Torrent + '"');
|
||||||
|
if (!su3Torrent.isEmpty())
|
||||||
|
out.write(" su3Torrent=\"" + su3Torrent + '"');
|
||||||
|
out.write("/>\n");
|
||||||
|
// su3 and feed metadata for debugging
|
||||||
|
out.write("** News version:\t" + DataHelper.stripHTML(sudVersion) + '\n');
|
||||||
|
out.write("** Signed by:\t" + signingKeyName + '\n');
|
||||||
|
out.write("** Feed:\t" + DataHelper.stripHTML(data.feedTitle) + '\n');
|
||||||
|
out.write("** Feed ID:\t" + DataHelper.stripHTML(data.feedID) + '\n');
|
||||||
|
out.write("** Feed Date:\t" + (new Date(data.feedUpdated)) + '\n');
|
||||||
|
out.write("-->\n");
|
||||||
|
if (entries == null)
|
||||||
|
return;
|
||||||
|
for (NewsEntry e : entries) {
|
||||||
|
if (e.title == null || e.content == null)
|
||||||
|
continue;
|
||||||
|
out.write("<!-- Entry Date: " + (new Date(e.updated)) + " -->\n");
|
||||||
|
out.write("<h3>");
|
||||||
|
out.write(e.title);
|
||||||
|
out.write("</h3>\n");
|
||||||
|
out.write(e.content);
|
||||||
|
out.write("\n\n");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (out != null) try {
|
||||||
|
out.close();
|
||||||
|
} catch (IOException ioe) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -225,7 +225,7 @@ public class TunnelUtil extends GeneralHelper {
|
|||||||
ed.putInt(res.getString(R.string.TUNNEL_OPT_QUANTITY),
|
ed.putInt(res.getString(R.string.TUNNEL_OPT_QUANTITY),
|
||||||
getTunnelQuantity(tunnel, res.getInteger(R.integer.DEFAULT_TUNNEL_QUANTITY)));
|
getTunnelQuantity(tunnel, res.getInteger(R.integer.DEFAULT_TUNNEL_QUANTITY)));
|
||||||
ed.putInt(res.getString(R.string.TUNNEL_OPT_BACKUP_QUANTITY),
|
ed.putInt(res.getString(R.string.TUNNEL_OPT_BACKUP_QUANTITY),
|
||||||
getTunnelQuantity(tunnel, res.getInteger(R.integer.DEFAULT_TUNNEL_BACKUP_QUANTITY)));
|
getTunnelBackupQuantity(tunnel, res.getInteger(R.integer.DEFAULT_TUNNEL_BACKUP_QUANTITY)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -328,7 +328,7 @@ public class MainFragment extends I2PFragmentBase {
|
|||||||
newState == State.NETWORK_STOPPED) {
|
newState == State.NETWORK_STOPPED) {
|
||||||
mConsoleLights.setImageResource(R.drawable.routerlogo_0);
|
mConsoleLights.setImageResource(R.drawable.routerlogo_0);
|
||||||
} else if (newState == State.STARTING ||
|
} else if (newState == State.STARTING ||
|
||||||
newState == State.GRACEFUL_SHUTDOWN ||
|
//newState == State.GRACEFUL_SHUTDOWN || // Don't change lights for graceful
|
||||||
newState == State.STOPPING ||
|
newState == State.STOPPING ||
|
||||||
newState == State.MANUAL_STOPPING ||
|
newState == State.MANUAL_STOPPING ||
|
||||||
newState == State.MANUAL_QUITTING ||
|
newState == State.MANUAL_QUITTING ||
|
||||||
@ -352,7 +352,10 @@ public class MainFragment extends I2PFragmentBase {
|
|||||||
vNetStatusText.setText(R.string.no_internet);
|
vNetStatusText.setText(R.string.no_internet);
|
||||||
vStatusContainer.setVisibility(View.VISIBLE);
|
vStatusContainer.setVisibility(View.VISIBLE);
|
||||||
vNonNetStatus.setVisibility(View.GONE);
|
vNonNetStatus.setVisibility(View.GONE);
|
||||||
} else if (ctx != null) {
|
} else if (lastRouterState != null &&
|
||||||
|
!Util.isStopping(lastRouterState) &&
|
||||||
|
!Util.isStopped(lastRouterState) &&
|
||||||
|
ctx != null) {
|
||||||
Util.NetStatus netStatus = Util.getNetStatus(getActivity(), ctx);
|
Util.NetStatus netStatus = Util.getNetStatus(getActivity(), ctx);
|
||||||
switch (netStatus.level) {
|
switch (netStatus.level) {
|
||||||
case ERROR:
|
case ERROR:
|
||||||
|
@ -60,7 +60,7 @@ public class NetDbStatsLoader extends AsyncTaskLoader<List<ObjectCounter<String>
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret.add(versions);
|
ret.add(versions);
|
||||||
ret.add(countries);
|
//ret.add(countries);
|
||||||
ret.add(transports);
|
ret.add(transports);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -113,15 +113,15 @@ public class NetDbSummaryPagerFragment extends I2PFragmentBase implements
|
|||||||
if (mData == null)
|
if (mData == null)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
return 3;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CharSequence getPageTitle(int i) {
|
public CharSequence getPageTitle(int i) {
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case 1:
|
case 1:
|
||||||
return getString(R.string.countries);
|
// return getString(R.string.countries);
|
||||||
case 2:
|
//case 2:
|
||||||
return getString(R.string.settings_label_transports);
|
return getString(R.string.settings_label_transports);
|
||||||
default:
|
default:
|
||||||
return getString(R.string.versions);
|
return getString(R.string.versions);
|
||||||
|
@ -51,7 +51,7 @@ public class NetDbSummaryTableFragment extends Fragment {
|
|||||||
|
|
||||||
switch (mCategory) {
|
switch (mCategory) {
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
//case 2:
|
||||||
Collections.sort(objects);
|
Collections.sort(objects);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -83,9 +83,9 @@ public class NetDbSummaryTableFragment extends Fragment {
|
|||||||
|
|
||||||
switch (mCategory) {
|
switch (mCategory) {
|
||||||
case 1:
|
case 1:
|
||||||
tl1.setText(R.string.country);
|
// tl1.setText(R.string.country);
|
||||||
break;
|
// break;
|
||||||
case 2:
|
//case 2:
|
||||||
tl1.setText(R.string.transport);
|
tl1.setText(R.string.transport);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
package net.i2p.android.router.service;
|
package net.i2p.android.router.service;
|
||||||
|
|
||||||
import java.util.Observable;
|
|
||||||
import java.util.Observer;
|
|
||||||
|
|
||||||
import com.androidplot.xy.SimpleXYSeries;
|
import com.androidplot.xy.SimpleXYSeries;
|
||||||
import com.androidplot.xy.XYSeries;
|
import com.androidplot.xy.XYSeries;
|
||||||
|
|
||||||
@ -11,6 +8,9 @@ import net.i2p.stat.Rate;
|
|||||||
import net.i2p.stat.RateStat;
|
import net.i2p.stat.RateStat;
|
||||||
import net.i2p.stat.RateSummaryListener;
|
import net.i2p.stat.RateSummaryListener;
|
||||||
|
|
||||||
|
import java.util.Observable;
|
||||||
|
import java.util.Observer;
|
||||||
|
|
||||||
public class SummaryListener implements RateSummaryListener {
|
public class SummaryListener implements RateSummaryListener {
|
||||||
public static final int HISTORY_SIZE = 30;
|
public static final int HISTORY_SIZE = 30;
|
||||||
|
|
||||||
@ -45,8 +45,7 @@ public class SummaryListener implements RateSummaryListener {
|
|||||||
|
|
||||||
public void add(double totalValue, long eventCount, double totalEventTime,
|
public void add(double totalValue, long eventCount, double totalEventTime,
|
||||||
long period) {
|
long period) {
|
||||||
long now = now();
|
long when = now();
|
||||||
long when = now / 1000;
|
|
||||||
double val = eventCount > 0 ? (totalValue / eventCount) : 0d;
|
double val = eventCount > 0 ? (totalValue / eventCount) : 0d;
|
||||||
|
|
||||||
if (_series.size() > HISTORY_SIZE)
|
if (_series.size() > HISTORY_SIZE)
|
||||||
@ -70,7 +69,6 @@ public class SummaryListener implements RateSummaryListener {
|
|||||||
long period = _rate.getPeriod();
|
long period = _rate.getPeriod();
|
||||||
_name = rs.getName() + "." + period;
|
_name = rs.getName() + "." + period;
|
||||||
_series = new SimpleXYSeries(_name);
|
_series = new SimpleXYSeries(_name);
|
||||||
_series.useImplicitXVals();
|
|
||||||
_rate.setSummaryListener(this);
|
_rate.setSummaryListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,9 +8,9 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.androidplot.Plot;
|
import com.androidplot.xy.BarFormatter;
|
||||||
|
import com.androidplot.xy.BarRenderer;
|
||||||
import com.androidplot.xy.BoundaryMode;
|
import com.androidplot.xy.BoundaryMode;
|
||||||
import com.androidplot.xy.LineAndPointFormatter;
|
|
||||||
import com.androidplot.xy.XYPlot;
|
import com.androidplot.xy.XYPlot;
|
||||||
import com.androidplot.xy.XYSeries;
|
import com.androidplot.xy.XYSeries;
|
||||||
import com.androidplot.xy.XYStepMode;
|
import com.androidplot.xy.XYStepMode;
|
||||||
@ -21,25 +21,22 @@ import net.i2p.android.router.service.StatSummarizer;
|
|||||||
import net.i2p.android.router.service.SummaryListener;
|
import net.i2p.android.router.service.SummaryListener;
|
||||||
import net.i2p.android.router.util.Util;
|
import net.i2p.android.router.util.Util;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.FieldPosition;
|
import java.text.FieldPosition;
|
||||||
import java.text.Format;
|
import java.text.Format;
|
||||||
import java.text.ParsePosition;
|
import java.text.ParsePosition;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.Observable;
|
import java.util.Observable;
|
||||||
import java.util.Observer;
|
import java.util.Observer;
|
||||||
|
|
||||||
public class RateGraphFragment extends I2PFragmentBase {
|
public class RateGraphFragment extends I2PFragmentBase {
|
||||||
// redraws a plot whenever an update is received:
|
// redraws a plot whenever an update is received:
|
||||||
private class MyPlotUpdater implements Observer {
|
private class MyPlotUpdater implements Observer {
|
||||||
Plot plot;
|
|
||||||
|
|
||||||
public MyPlotUpdater(Plot plot) {
|
|
||||||
this.plot = plot;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void update(Observable o, Object arg) {
|
public void update(Observable o, Object arg) {
|
||||||
Util.d("Redrawing plot");
|
Util.d("Redrawing plot");
|
||||||
plot.redraw();
|
updatePlot();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,6 +48,7 @@ public class RateGraphFragment extends I2PFragmentBase {
|
|||||||
private SummaryListener _listener;
|
private SummaryListener _listener;
|
||||||
private XYPlot _ratePlot;
|
private XYPlot _ratePlot;
|
||||||
private MyPlotUpdater _plotUpdater;
|
private MyPlotUpdater _plotUpdater;
|
||||||
|
private int _k;
|
||||||
|
|
||||||
public static RateGraphFragment newInstance(String name, long period) {
|
public static RateGraphFragment newInstance(String name, long period) {
|
||||||
RateGraphFragment f = new RateGraphFragment();
|
RateGraphFragment f = new RateGraphFragment();
|
||||||
@ -70,7 +68,7 @@ public class RateGraphFragment extends I2PFragmentBase {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
View v = inflater.inflate(R.layout.fragment_graph, container, false);
|
View v = inflater.inflate(R.layout.fragment_graph, container, false);
|
||||||
|
|
||||||
_ratePlot = (XYPlot) v.findViewById(R.id.rate_stat_plot);
|
_ratePlot = (XYPlot) v.findViewById(R.id.rate_stat_plot);
|
||||||
@ -99,6 +97,9 @@ public class RateGraphFragment extends I2PFragmentBase {
|
|||||||
public void run() {
|
public void run() {
|
||||||
String rateName = getArguments().getString(RATE_NAME);
|
String rateName = getArguments().getString(RATE_NAME);
|
||||||
long period = getArguments().getLong(RATE_PERIOD);
|
long period = getArguments().getLong(RATE_PERIOD);
|
||||||
|
_k = 1000;
|
||||||
|
if (rateName.startsWith("bw.") || rateName.contains("Size") || rateName.contains("Bps") || rateName.contains("memory"))
|
||||||
|
_k = 1024;
|
||||||
|
|
||||||
Util.d("Setting up " + rateName + "." + period);
|
Util.d("Setting up " + rateName + "." + period);
|
||||||
if (StatSummarizer.instance() == null) {
|
if (StatSummarizer.instance() == null) {
|
||||||
@ -115,9 +116,11 @@ public class RateGraphFragment extends I2PFragmentBase {
|
|||||||
|
|
||||||
XYSeries rateSeries = _listener.getSeries();
|
XYSeries rateSeries = _listener.getSeries();
|
||||||
|
|
||||||
_plotUpdater = new MyPlotUpdater(_ratePlot);
|
_plotUpdater = new MyPlotUpdater();
|
||||||
|
|
||||||
_ratePlot.addSeries(rateSeries, new LineAndPointFormatter(Color.rgb(0, 0, 0), null, Color.rgb(0, 80, 0), null));
|
_ratePlot.addSeries(rateSeries, new BarFormatter(Color.argb(200, 0, 80, 0), Color.argb(200, 0, 80, 0)));
|
||||||
|
_ratePlot.calculateMinMaxVals();
|
||||||
|
long maxX = _ratePlot.getCalculatedMaxX().longValue();
|
||||||
|
|
||||||
Util.d("Adding plot updater to listener");
|
Util.d("Adding plot updater to listener");
|
||||||
_listener.addObserver(_plotUpdater);
|
_listener.addObserver(_plotUpdater);
|
||||||
@ -125,31 +128,56 @@ public class RateGraphFragment extends I2PFragmentBase {
|
|||||||
// Only one line, so hide the legend
|
// Only one line, so hide the legend
|
||||||
_ratePlot.getLegendWidget().setVisible(false);
|
_ratePlot.getLegendWidget().setVisible(false);
|
||||||
|
|
||||||
_ratePlot.setDomainStepMode(XYStepMode.SUBDIVIDE);
|
BarRenderer renderer = (BarRenderer) _ratePlot.getRenderer(BarRenderer.class);
|
||||||
_ratePlot.setDomainStepValue(SummaryListener.HISTORY_SIZE);
|
renderer.setBarWidthStyle(BarRenderer.BarWidthStyle.VARIABLE_WIDTH);
|
||||||
|
renderer.setBarGap(0);
|
||||||
|
|
||||||
// thin out domain/range tick labels so they dont overlap each other:
|
_ratePlot.setDomainUpperBoundary(maxX, BoundaryMode.GROW);
|
||||||
_ratePlot.setTicksPerDomainLabel(5);
|
_ratePlot.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 15 * 60 * 1000);
|
||||||
_ratePlot.setTicksPerRangeLabel(3);
|
_ratePlot.setTicksPerDomainLabel(4);
|
||||||
|
|
||||||
_ratePlot.setRangeLowerBoundary(0, BoundaryMode.FIXED);
|
_ratePlot.setRangeLowerBoundary(0, BoundaryMode.FIXED);
|
||||||
|
_ratePlot.setTicksPerRangeLabel(5);
|
||||||
|
|
||||||
|
_ratePlot.setDomainValueFormat(new Format() {
|
||||||
|
private DateFormat dateFormat = SimpleDateFormat.getTimeInstance(DateFormat.SHORT);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StringBuffer format(Object obj, @NonNull StringBuffer toAppendTo,
|
||||||
|
@NonNull FieldPosition pos) {
|
||||||
|
long when = ((Number) obj).longValue();
|
||||||
|
Date date = new Date(when);
|
||||||
|
return dateFormat.format(date, toAppendTo, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object parseObject(String s, @NonNull ParsePosition parsePosition) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final int finalK = _k;
|
||||||
_ratePlot.setRangeValueFormat(new Format() {
|
_ratePlot.setRangeValueFormat(new Format() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StringBuffer format(Object obj, @NonNull StringBuffer toAppendTo,
|
public StringBuffer format(Object obj, @NonNull StringBuffer toAppendTo,
|
||||||
@NonNull FieldPosition pos) {
|
@NonNull FieldPosition pos) {
|
||||||
double val = ((Number) obj).doubleValue();
|
double val = ((Number) obj).doubleValue();
|
||||||
if (val >= 10 * 1000 * 1000)
|
double maxY = _ratePlot.getCalculatedMaxY().doubleValue();
|
||||||
return new DecimalFormat("0 M").format(val / (1000 * 1000), toAppendTo, pos);
|
|
||||||
else if (val >= 8 * 100 * 1000)
|
if (val == 0 || maxY < finalK) {
|
||||||
return new DecimalFormat("0.0 M").format(val / (1000 * 1000), toAppendTo, pos);
|
|
||||||
else if (val >= 10 * 1000)
|
|
||||||
return new DecimalFormat("0 k").format(val / (1000), toAppendTo, pos);
|
|
||||||
else if (val >= 8 * 100)
|
|
||||||
return new DecimalFormat("0.0 k").format(val / (1000), toAppendTo, pos);
|
|
||||||
else
|
|
||||||
return new DecimalFormat("0").format(val, toAppendTo, pos);
|
return new DecimalFormat("0").format(val, toAppendTo, pos);
|
||||||
|
} else if (maxY < finalK * finalK) {
|
||||||
|
if (val < 10 * finalK)
|
||||||
|
return new DecimalFormat("0.0 k").format(val / (1000), toAppendTo, pos);
|
||||||
|
else
|
||||||
|
return new DecimalFormat("0 k").format(val / (1000), toAppendTo, pos);
|
||||||
|
} else {
|
||||||
|
if (val < 10 * finalK * finalK)
|
||||||
|
return new DecimalFormat("0.0 M").format(val / (finalK * finalK), toAppendTo, pos);
|
||||||
|
else
|
||||||
|
return new DecimalFormat("0 M").format(val / (finalK * finalK), toAppendTo, pos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -160,7 +188,45 @@ public class RateGraphFragment extends I2PFragmentBase {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Util.d("Redrawing plot");
|
Util.d("Redrawing plot");
|
||||||
_ratePlot.redraw();
|
updatePlot();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updatePlot() {
|
||||||
|
_ratePlot.calculateMinMaxVals();
|
||||||
|
double maxY = _ratePlot.getCalculatedMaxY().doubleValue();
|
||||||
|
_ratePlot.setRangeStep(XYStepMode.INCREMENT_BY_VAL, getRangeStep(maxY, _k));
|
||||||
|
|
||||||
|
_ratePlot.redraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getRangeStep(double maxY, int k) {
|
||||||
|
if (maxY >= k * k)
|
||||||
|
return getRangeStepForScale(maxY, k * k);
|
||||||
|
else if (maxY >= k)
|
||||||
|
return getRangeStepForScale(maxY, k);
|
||||||
|
else
|
||||||
|
return getRangeStepForScale(maxY, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private double getRangeStepForScale(double maxY, int scale) {
|
||||||
|
if (maxY >= 400 * scale)
|
||||||
|
return 40 * scale;
|
||||||
|
else if (maxY >= 200 * scale)
|
||||||
|
return 20 * scale;
|
||||||
|
else if (maxY >= 100 * scale)
|
||||||
|
return 10 * scale;
|
||||||
|
else if (maxY >= 40 * scale)
|
||||||
|
return 4 * scale;
|
||||||
|
else if (maxY >= 20 * scale)
|
||||||
|
return 2 * scale;
|
||||||
|
else if (maxY >= 10 * scale)
|
||||||
|
return scale;
|
||||||
|
else if (maxY >= 4 * scale)
|
||||||
|
return 0.4 * scale;
|
||||||
|
else if (maxY >= 2 * scale)
|
||||||
|
return 0.2 * scale;
|
||||||
|
else
|
||||||
|
return 0.1 * scale;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,8 @@ public abstract class Util implements I2PConstants {
|
|||||||
//System.err.println("APK Path" + ": " + _apkPath);
|
//System.err.println("APK Path" + ": " + _apkPath);
|
||||||
if (pi.versionName != null)
|
if (pi.versionName != null)
|
||||||
return pi.versionName;
|
return pi.versionName;
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
return "??";
|
return "??";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +61,7 @@ public abstract class Util implements I2PConstants {
|
|||||||
*/
|
*/
|
||||||
public static RouterContext getRouterContext() {
|
public static RouterContext getRouterContext() {
|
||||||
List<RouterContext> contexts = RouterContext.listContexts();
|
List<RouterContext> contexts = RouterContext.listContexts();
|
||||||
if ( !((contexts == null) || (contexts.isEmpty())) ) {
|
if (!((contexts == null) || (contexts.isEmpty()))) {
|
||||||
return contexts.get(0);
|
return contexts.get(0);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -73,8 +74,8 @@ public abstract class Util implements I2PConstants {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Log to the context logger if available (which goes to the console buffer
|
* Log to the context logger if available (which goes to the console buffer
|
||||||
* and to logcat), else just to logcat.
|
* and to logcat), else just to logcat.
|
||||||
*/
|
*/
|
||||||
public static void e(String m, Throwable t) {
|
public static void e(String m, Throwable t) {
|
||||||
I2PAppContext ctx = I2PAppContext.getCurrentContext();
|
I2PAppContext ctx = I2PAppContext.getCurrentContext();
|
||||||
@ -119,6 +120,7 @@ public abstract class Util implements I2PConstants {
|
|||||||
android.util.Log.i(ANDROID_TAG, m);
|
android.util.Log.i(ANDROID_TAG, m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void d(String m) {
|
public static void d(String m) {
|
||||||
d(m, null);
|
d(m, null);
|
||||||
}
|
}
|
||||||
@ -135,7 +137,9 @@ public abstract class Util implements I2PConstants {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** copied from various private components */
|
/**
|
||||||
|
* copied from various private components
|
||||||
|
*/
|
||||||
final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port";
|
final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port";
|
||||||
final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport";
|
final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport";
|
||||||
|
|
||||||
@ -229,6 +233,7 @@ public abstract class Util implements I2PConstants {
|
|||||||
// propName -> defaultValue
|
// propName -> defaultValue
|
||||||
private static HashMap<String, Boolean> booleanOptionsRequiringRestart = new HashMap<>();
|
private static HashMap<String, Boolean> booleanOptionsRequiringRestart = new HashMap<>();
|
||||||
private static HashMap<String, String> stringOptionsRequiringRestart = new HashMap<>();
|
private static HashMap<String, String> stringOptionsRequiringRestart = new HashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
HashMap<String, Boolean> boolToAdd = new HashMap<>();
|
HashMap<String, Boolean> boolToAdd = new HashMap<>();
|
||||||
HashMap<String, String> strToAdd = new HashMap<>();
|
HashMap<String, String> strToAdd = new HashMap<>();
|
||||||
@ -245,6 +250,7 @@ public abstract class Util implements I2PConstants {
|
|||||||
booleanOptionsRequiringRestart.putAll(boolToAdd);
|
booleanOptionsRequiringRestart.putAll(boolToAdd);
|
||||||
stringOptionsRequiringRestart.putAll(strToAdd);
|
stringOptionsRequiringRestart.putAll(strToAdd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function performs two tasks:
|
* This function performs two tasks:
|
||||||
* <ul><li>
|
* <ul><li>
|
||||||
@ -256,7 +262,7 @@ public abstract class Util implements I2PConstants {
|
|||||||
* changed that will require a router restart.
|
* changed that will require a router restart.
|
||||||
* </li></ul>
|
* </li></ul>
|
||||||
*
|
*
|
||||||
* @param props a Properties object containing the router.config
|
* @param props a Properties object containing the router.config
|
||||||
* @param toRemove a Collection of properties that will be removed
|
* @param toRemove a Collection of properties that will be removed
|
||||||
* @return true if the router needs to be restarted.
|
* @return true if the router needs to be restarted.
|
||||||
*/
|
*/
|
||||||
@ -297,26 +303,26 @@ public abstract class Util implements I2PConstants {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write properties to a file. If the file does not exist, it is created.
|
* Write properties to a file. If the file does not exist, it is created.
|
||||||
* If the properties already exist in the file, they are updated.
|
* If the properties already exist in the file, they are updated.
|
||||||
*
|
*
|
||||||
* @param dir the file directory
|
* @param dir the file directory
|
||||||
* @param file relative to dir
|
* @param file relative to dir
|
||||||
* @param props properties to set
|
* @param props properties to set
|
||||||
*/
|
*/
|
||||||
public static void writePropertiesToFile(Context ctx, String dir, String file, Properties props) {
|
public static void writePropertiesToFile(Context ctx, String dir, String file, Properties props) {
|
||||||
mergeResourceToFile(ctx, dir, file, 0, props, null);
|
mergeResourceToFile(ctx, dir, file, 0, props, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load defaults from resource, then add props from settings, and write back.
|
* Load defaults from resource, then add props from settings, and write back.
|
||||||
* If resID is 0, defaults are not written over the existing file content.
|
* If resID is 0, defaults are not written over the existing file content.
|
||||||
*
|
*
|
||||||
* @param dir the file directory
|
* @param dir the file directory
|
||||||
* @param file relative to dir
|
* @param file relative to dir
|
||||||
* @param resID the ID of the default resource, or 0
|
* @param resID the ID of the default resource, or 0
|
||||||
* @param userProps local properties or null
|
* @param userProps local properties or null
|
||||||
* @param toRemove properties to remove, or null
|
* @param toRemove properties to remove, or null
|
||||||
*/
|
*/
|
||||||
public static void mergeResourceToFile(Context ctx, String dir, String file, int resID,
|
public static void mergeResourceToFile(Context ctx, String dir, String file, int resID,
|
||||||
Properties userProps, Collection<String> toRemove) {
|
Properties userProps, Collection<String> toRemove) {
|
||||||
@ -343,7 +349,7 @@ public abstract class Util implements I2PConstants {
|
|||||||
if (resID > 0)
|
if (resID > 0)
|
||||||
in = ctx.getResources().openRawResource(resID);
|
in = ctx.getResources().openRawResource(resID);
|
||||||
if (in != null)
|
if (in != null)
|
||||||
DataHelper.loadProps(props, in);
|
DataHelper.loadProps(props, in);
|
||||||
|
|
||||||
// override with user settings
|
// override with user settings
|
||||||
if (userProps != null)
|
if (userProps != null)
|
||||||
@ -356,12 +362,18 @@ public abstract class Util implements I2PConstants {
|
|||||||
|
|
||||||
File path = new File(dir, file);
|
File path = new File(dir, file);
|
||||||
DataHelper.storeProps(props, path);
|
DataHelper.storeProps(props, path);
|
||||||
Util.d("Saved " + props.size() +" properties in " + file);
|
Util.d("Saved " + props.size() + " properties in " + file);
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
} catch (Resources.NotFoundException nfe) {
|
} catch (Resources.NotFoundException nfe) {
|
||||||
} finally {
|
} finally {
|
||||||
if (in != null) try { in.close(); } catch (IOException ioe) {}
|
if (in != null) try {
|
||||||
if (fin != null) try { fin.close(); } catch (IOException ioe) {}
|
in.close();
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
}
|
||||||
|
if (fin != null) try {
|
||||||
|
fin.close();
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,10 +405,11 @@ public abstract class Util implements I2PConstants {
|
|||||||
this.status = status;
|
this.status = status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NetStatus getNetStatus(Context ctx, RouterContext rCtx) {
|
public static NetStatus getNetStatus(Context ctx, RouterContext rCtx) {
|
||||||
if (rCtx.commSystem().isDummy())
|
if (rCtx.commSystem().isDummy())
|
||||||
return new NetStatus(NetStatus.Level.INFO, ctx.getString(R.string.vm_comm_system));
|
return new NetStatus(NetStatus.Level.INFO, ctx.getString(R.string.vm_comm_system));
|
||||||
if (rCtx.router().getUptime() > 60*1000 && (!rCtx.router().gracefulShutdownInProgress()) &&
|
if (rCtx.router().getUptime() > 60 * 1000 && (!rCtx.router().gracefulShutdownInProgress()) &&
|
||||||
!rCtx.clientManager().isAlive()) // not a router problem but the user should know
|
!rCtx.clientManager().isAlive()) // not a router problem but the user should know
|
||||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_i2cp));
|
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_i2cp));
|
||||||
// Warn based on actual skew from peers, not update status, so if we successfully offset
|
// Warn based on actual skew from peers, not update status, so if we successfully offset
|
||||||
@ -404,9 +417,12 @@ public abstract class Util implements I2PConstants {
|
|||||||
//if (!rCtx.clock().getUpdatedSuccessfully())
|
//if (!rCtx.clock().getUpdatedSuccessfully())
|
||||||
long skew = rCtx.commSystem().getFramedAveragePeerClockSkew(33);
|
long skew = rCtx.commSystem().getFramedAveragePeerClockSkew(33);
|
||||||
// Display the actual skew, not the offset
|
// Display the actual skew, not the offset
|
||||||
if (Math.abs(skew) > 30*1000)
|
if (Math.abs(skew) > 30 * 1000)
|
||||||
return new NetStatus(NetStatus.Level.ERROR,
|
return new NetStatus(NetStatus.Level.ERROR,
|
||||||
ctx.getString(R.string.net_status_error_skew, DataHelper.formatDuration2(Math.abs(skew))));
|
ctx.getString(R.string.net_status_error_skew,
|
||||||
|
DataHelper.formatDuration2(Math.abs(skew))
|
||||||
|
.replace("−", "-")
|
||||||
|
.replace(" ", " ")));
|
||||||
if (rCtx.router().isHidden())
|
if (rCtx.router().isHidden())
|
||||||
return new NetStatus(NetStatus.Level.INFO, ctx.getString(R.string.hidden));
|
return new NetStatus(NetStatus.Level.INFO, ctx.getString(R.string.hidden));
|
||||||
RouterInfo routerInfo = rCtx.router().getRouterInfo();
|
RouterInfo routerInfo = rCtx.router().getRouterInfo();
|
||||||
@ -460,7 +476,7 @@ public abstract class Util implements I2PConstants {
|
|||||||
case IPV4_DISABLED_IPV6_UNKNOWN:
|
case IPV4_DISABLED_IPV6_UNKNOWN:
|
||||||
default:
|
default:
|
||||||
ra = routerInfo.getTargetAddress("SSU");
|
ra = routerInfo.getTargetAddress("SSU");
|
||||||
if (ra == null && rCtx.router().getUptime() > 5*60*1000) {
|
if (ra == null && rCtx.router().getUptime() > 5 * 60 * 1000) {
|
||||||
if (rCtx.commSystem().countActivePeers() <= 0)
|
if (rCtx.commSystem().countActivePeers() <= 0)
|
||||||
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_no_active_peers));
|
return new NetStatus(NetStatus.Level.ERROR, ctx.getString(R.string.net_status_error_no_active_peers));
|
||||||
else if (rCtx.getProperty(ctx.getString(R.string.PROP_I2NP_NTCP_HOSTNAME)) == null ||
|
else if (rCtx.getProperty(ctx.getString(R.string.PROP_I2NP_NTCP_HOSTNAME)) == null ||
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
package net.i2p.android.router.web;
|
package net.i2p.android.router.web;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
import net.i2p.android.I2PActivityBase;
|
import net.i2p.android.I2PActivityBase;
|
||||||
import net.i2p.android.router.R;
|
import net.i2p.android.router.R;
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
public class WebActivity extends I2PActivityBase {
|
public class WebActivity extends I2PActivityBase {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_single_fragment);
|
||||||
// Start with the base view
|
// Start with the base view
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
WebFragment f = new WebFragment();
|
WebFragment f = new WebFragment();
|
||||||
@ -18,13 +20,13 @@ public class WebActivity extends I2PActivityBase {
|
|||||||
} else
|
} else
|
||||||
f.setArguments(getIntent().getExtras());
|
f.setArguments(getIntent().getExtras());
|
||||||
getSupportFragmentManager().beginTransaction()
|
getSupportFragmentManager().beginTransaction()
|
||||||
.add(R.id.main_fragment, f).commit();
|
.add(R.id.fragment, f).commit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
WebFragment f = (WebFragment) getSupportFragmentManager().findFragmentById(R.id.main_fragment);
|
WebFragment f = (WebFragment) getSupportFragmentManager().findFragmentById(R.id.fragment);
|
||||||
if (!f.onBackPressed())
|
if (!f.onBackPressed())
|
||||||
super.onBackPressed();
|
super.onBackPressed();
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
******* Please read all of the following *******
|
******* Please read all of the following *******
|
||||||
|
|
||||||
WARNING - This is BETA SOFTWARE.
|
General notes
|
||||||
* It may crash your phone.
|
-------------
|
||||||
* Do not rely upon it for strong anonymity.
|
|
||||||
* Tunnels may be as short as one hop.
|
|
||||||
* There may be serious security holes in the app.
|
|
||||||
|
|
||||||
Minimum Android OS is 2.3 (API 9). It uses a lot of RAM. You need at least 256 MB of RAM. 512 should be much better.
|
The app uses a lot of RAM. Your device needs at least 256 MB of RAM. 512 should be much better.
|
||||||
|
|
||||||
The app may use a lot of RAM even after the router has stopped and there is no icon in the notification bar. Go to Settings -> Applications -> Running Services and stop the I2P service if necessary. Or Settings -> Applications -> Manage Applications -> Running -> I2P and force stop.
|
The app may use a lot of RAM even after the router has stopped and there is no icon in the notification bar. Go to Settings -> Applications -> Running Services and stop the I2P service if necessary. Or Settings -> Applications -> Manage Applications -> Running -> I2P and force stop.
|
||||||
|
|
||||||
@ -14,17 +11,21 @@ The app may be moved to the SD card. The app does not store any files on the SD
|
|||||||
|
|
||||||
The app runs on either wifi or mobile networks. For now, the app is relatively low bandwidth. It allows a max of 20 participating tunnels.
|
The app runs on either wifi or mobile networks. For now, the app is relatively low bandwidth. It allows a max of 20 participating tunnels.
|
||||||
|
|
||||||
The app uses both UDP and TCP for router-router connections, with a maximum of 36 connections on each transport. UPnP is enabled.
|
The app will work best when you are not changing IPs. If you are moving around, changing wifi networks, or switching between mobile and wifi networks, it won't work well.
|
||||||
|
|
||||||
|
|
||||||
|
Advanced notes
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The app uses both UDP and TCP for router-router connections, with a maximum of 32 connections on each transport by default. UPnP is enabled.
|
||||||
|
|
||||||
I2P's NTP is disabled for API 11 (Honeycomb) and above, as those versions include NTP support. If you have cell service, your phone or tablet should have the correct time. If you do not have cell service, ensure your device has accurate time.
|
I2P's NTP is disabled for API 11 (Honeycomb) and above, as those versions include NTP support. If you have cell service, your phone or tablet should have the correct time. If you do not have cell service, ensure your device has accurate time.
|
||||||
|
|
||||||
The app will work best when you are not changing IPs. If you are moving around, changing wifi networks, or switching between mobile and wifi networks, it won't work well.
|
|
||||||
|
|
||||||
|
|
||||||
Further anonymity warnings
|
Further anonymity warnings
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
* Exploratory and Client Tunnels are 2 hops
|
* Exploratory and Client Tunnels are 2 hops by default
|
||||||
* Sharing IRC clients on same tunnels allows for linking
|
* Sharing IRC clients on same tunnels allows for linking
|
||||||
* There are .i2p DNS leaks
|
* There are .i2p DNS leaks
|
||||||
* Cell phones aren't exactly secure environments
|
* Cell phones aren't exactly secure environments
|
||||||
|
@ -31,15 +31,20 @@
|
|||||||
<string name="firewalled">Mit Firewall</string>
|
<string name="firewalled">Mit Firewall</string>
|
||||||
<string name="symmetric_nat">Symmetrisches NAT</string>
|
<string name="symmetric_nat">Symmetrisches NAT</string>
|
||||||
<!--Parameter is a time, e.g. 32s or 2m-->
|
<!--Parameter is a time, e.g. 32s or 2m-->
|
||||||
|
<string name="net_status_error_skew">Zeitabweichung von %s</string>
|
||||||
<string name="net_status_error_unresolved_tcp">Nicht aufgelöste TCP-Adresse</string>
|
<string name="net_status_error_unresolved_tcp">Nicht aufgelöste TCP-Adresse</string>
|
||||||
<string name="net_status_error_private_tcp">Private TCP-Adresse</string>
|
<string name="net_status_error_private_tcp">Private TCP-Adresse</string>
|
||||||
<string name="net_status_warn_firewalled_inbound_tcp">Mit Firewall und aktiviertem eingehendem TCP</string>
|
<string name="net_status_warn_firewalled_inbound_tcp">Mit Firewall und aktiviertem eingehendem TCP</string>
|
||||||
|
<string name="net_status_warn_firewalled_floodfill">Mit Firewall und Floodfill</string>
|
||||||
<string name="net_status_info_disconnected">Getrennt - überprüfen Sie die Netzwerkverbindung</string>
|
<string name="net_status_info_disconnected">Getrennt - überprüfen Sie die Netzwerkverbindung</string>
|
||||||
<string name="net_status_error_udp_port">UDP-Port in Gebrauch - in Einstellungen ändern und neu starten</string>
|
<string name="net_status_error_udp_port">UDP-Port in Gebrauch - in Einstellungen ändern und neu starten</string>
|
||||||
|
<string name="net_status_error_no_active_peers">Keine aktiven Teilnehmer - überprüfen Sie die Netzwerkverbindung und Firewall</string>
|
||||||
<string name="net_status_error_udp_disabled_tcp_not_set">UDP deaktiviert und eingehender TCP-Host/Port nicht festgelegt</string>
|
<string name="net_status_error_udp_disabled_tcp_not_set">UDP deaktiviert und eingehender TCP-Host/Port nicht festgelegt</string>
|
||||||
<string name="net_status_warn_firewalled_udp_disabled">Mit Firewall und deaktiviertem UDP</string>
|
<string name="net_status_warn_firewalled_udp_disabled">Mit Firewall und deaktiviertem UDP</string>
|
||||||
<string name="shared_clients">Mehrere Klienten</string>
|
<string name="shared_clients">Mehrere Klienten</string>
|
||||||
<string name="uptime">Betriebszeit</string>
|
<string name="uptime">Betriebszeit</string>
|
||||||
|
<string name="active_peers">Aktive Teilnehmer</string>
|
||||||
|
<string name="known_peers">Bekannte Teilnehmer</string>
|
||||||
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
|
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
|
||||||
<string name="char_client_tunnel">C</string>
|
<string name="char_client_tunnel">C</string>
|
||||||
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
|
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<string name="label_i2ptunnel_server">Túneles de servidor</string>
|
<string name="label_i2ptunnel_server">Túneles de servidor</string>
|
||||||
<string name="label_logs">Registros (logs)</string>
|
<string name="label_logs">Registros (logs)</string>
|
||||||
<string name="label_error_logs">Registros (logs) de errores</string>
|
<string name="label_error_logs">Registros (logs) de errores</string>
|
||||||
<string name="label_news">Novedades</string>
|
<string name="label_news">Novedades de la consola</string>
|
||||||
<string name="label_peers_status">Pares (peers)</string>
|
<string name="label_peers_status">Pares (peers)</string>
|
||||||
<string name="label_release_notes">Notas de versiones</string>
|
<string name="label_release_notes">Notas de versiones</string>
|
||||||
<string name="label_licenses">Licencias</string>
|
<string name="label_licenses">Licencias</string>
|
||||||
@ -38,12 +38,12 @@
|
|||||||
<string name="net_status_warn_firewalled_inbound_tcp">Bloqueado por cortafuegos (firewall) con TCP entrante habilitado</string>
|
<string name="net_status_warn_firewalled_inbound_tcp">Bloqueado por cortafuegos (firewall) con TCP entrante habilitado</string>
|
||||||
<string name="net_status_warn_firewalled_floodfill">Bloqueado por cortafuegos (firewall) y es router I2P de inundación (floodfill)</string>
|
<string name="net_status_warn_firewalled_floodfill">Bloqueado por cortafuegos (firewall) y es router I2P de inundación (floodfill)</string>
|
||||||
<string name="net_status_info_disconnected">Desconectado - compruebe la conexión a la red</string>
|
<string name="net_status_info_disconnected">Desconectado - compruebe la conexión a la red</string>
|
||||||
<string name="net_status_error_udp_port">Puerto UDP en uso - cámbielo en la configuracion y reinicie</string>
|
<string name="net_status_error_udp_port">Puerto UDP en uso - cámbielo en la configuración y reinicie</string>
|
||||||
<string name="net_status_error_no_active_peers">No hay pares (peers) activos - compruebe la conexión a la red y el cortafuegos (firewall)</string>
|
<string name="net_status_error_no_active_peers">No hay pares (peers) activos - compruebe la conexión a la red y el cortafuegos (firewall)</string>
|
||||||
<string name="net_status_error_udp_disabled_tcp_not_set">UDP deshabilitado y nodo/puerto TCP de entrante no establecido</string>
|
<string name="net_status_error_udp_disabled_tcp_not_set">UDP deshabilitado y nodo/puerto-TCP de entrada no establecido</string>
|
||||||
<string name="net_status_warn_firewalled_udp_disabled">Bloqueado por cortafuegos (firewall) con UDP deshabilitado</string>
|
<string name="net_status_warn_firewalled_udp_disabled">Bloqueado por cortafuegos (firewall) con UDP deshabilitado</string>
|
||||||
<string name="shared_clients">Clientes compartidos</string>
|
<string name="shared_clients">Clientes compartidos</string>
|
||||||
<string name="uptime">Tiempo de funcionamiento</string>
|
<string name="uptime">Tiempo en funcionamiento</string>
|
||||||
<string name="active_peers">Pares activos</string>
|
<string name="active_peers">Pares activos</string>
|
||||||
<string name="known_peers">Pares conocidos</string>
|
<string name="known_peers">Pares conocidos</string>
|
||||||
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
|
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
|
||||||
@ -54,17 +54,17 @@
|
|||||||
<string name="download">Descarga</string>
|
<string name="download">Descarga</string>
|
||||||
<string name="upload">Subida</string>
|
<string name="upload">Subida</string>
|
||||||
<string name="configure_browser_title">¿Configurar navegador?</string>
|
<string name="configure_browser_title">¿Configurar navegador?</string>
|
||||||
<string name="configure_browser_for_i2p">¿Le gustaría configurar un navegador para ver sitios I2P? (también puede hacer esto más tarde desde el menú de ayuda).</string>
|
<string name="configure_browser_for_i2p">¿Desea configurar un navegador para ver sitios I2P? (también puede hacer esto más tarde desde el menú de ayuda).</string>
|
||||||
<string name="first_start_title">¡Felicidades por conseguir instalar I2P!</string>
|
<string name="first_start_title">¡Felicidades por conseguir instalar I2P!</string>
|
||||||
<string name="first_start_welcome"><b>¡Bienvenido a I2P!</b> Por favor <b>tenga paciencia</b> mientras I2P se inicia y busca pares (peers).</string>
|
<string name="first_start_welcome"><b>¡Bienvenido a I2P!</b> Por favor, <b>tenga paciencia</b> mientras I2P se inicia y busca pares (peers).</string>
|
||||||
<string name="first_start_read">Mientras esté esperando, por favor, lea las notas de la versión y la página de bienvenida.</string>
|
<string name="first_start_read">Mientras espera, por favor, lea las notas de la versión y la página de bienvenida.</string>
|
||||||
<string name="first_start_faq">Una vez tenga túneles de cliente, por favor, <b>revise</b> nuestras preguntas frecuentes (FAQ):</string>
|
<string name="first_start_faq">Una vez tenga túneles de cliente, por favor, <b>eche un vistazo</b> a nuestras preguntas frecuentes (FAQ):</string>
|
||||||
<string name="first_start_faq_nonanon">O use este enlace no-anónimo si no quiere esperar a los túneles:</string>
|
<string name="first_start_faq_nonanon">O utilice este enlace no-anónimo si no quiere esperar a los túneles:</string>
|
||||||
<string name="first_start_irc">Dirija su cliente IRC a <b>localhost:6668</b> y salúdenos en:</string>
|
<string name="first_start_irc">Dirija su cliente IRC hacia <b>localhost:6668</b> y pase a saludarnos en:</string>
|
||||||
<string name="action_search">Buscar</string>
|
<string name="action_search">Buscar</string>
|
||||||
<string name="action_add">Añadir</string>
|
<string name="action_add">Añadir</string>
|
||||||
<string name="action_edit">Editar</string>
|
<string name="action_edit">Editar</string>
|
||||||
<string name="action_delete">Borrar</string>
|
<string name="action_delete">Eliminar</string>
|
||||||
<string name="action_i2ptunnel_start">Iniciar túnel</string>
|
<string name="action_i2ptunnel_start">Iniciar túnel</string>
|
||||||
<string name="action_i2ptunnel_stop">Detener túnel</string>
|
<string name="action_i2ptunnel_stop">Detener túnel</string>
|
||||||
<string name="action_i2ptunnel_start_all">Iniciar todos los túneles</string>
|
<string name="action_i2ptunnel_start_all">Iniciar todos los túneles</string>
|
||||||
@ -74,14 +74,14 @@
|
|||||||
<string name="action_refresh">Refrescar</string>
|
<string name="action_refresh">Refrescar</string>
|
||||||
<string name="hint_search_addressbook">Buscar en la libreta de direcciones</string>
|
<string name="hint_search_addressbook">Buscar en la libreta de direcciones</string>
|
||||||
<string name="action_reload_subscriptions">Volver a cargar suscripciones</string>
|
<string name="action_reload_subscriptions">Volver a cargar suscripciones</string>
|
||||||
<string name="news_last_updated">Última actualización de novedades hace %s</string>
|
<string name="news_last_updated">Última actualización de las novedades de consola hace %s</string>
|
||||||
<string name="news_last_checked">Última comprobación de novedades hace %s</string>
|
<string name="news_last_checked">Última comprobación de las novedades de consola hace %s</string>
|
||||||
<string name="news_updated">Novedades actualizadas</string>
|
<string name="news_updated">Novedades de consola actualizadas</string>
|
||||||
<string name="view_news">Pulse para ver las últimas novedades de I2P</string>
|
<string name="view_news">Pulse para ver las últimas novedades de consola de I2P</string>
|
||||||
<string name="router_not_running">El router I2P no está en marcha.</string>
|
<string name="router_not_running">El router I2P no está en marcha.</string>
|
||||||
<string name="router_shutting_down">El router I2P se está cerrando.</string>
|
<string name="router_shutting_down">El router I2P se está cerrando.</string>
|
||||||
<string name="stats_not_ready">El administrador de estadísticas aún no está listo. Inténtelo de nuevo más tarde.</string>
|
<string name="stats_not_ready">El administrador de estadísticas aún no está listo. Inténtelo de nuevo más tarde.</string>
|
||||||
<string name="no_graphs_configured">No se ha configurado ninguna gráfica. Puede escoger estadísticas a graficar en el menú de configuración. Cualquier cambio tendrá efecto después de 60 segundos.</string>
|
<string name="no_graphs_configured">No se ha configurado ninguna gráfica. Puede escoger las estadísticas a graficar en el menú de configuración. Cualquier cambio tendrá efecto después de 60 segundos.</string>
|
||||||
<string name="configure_graphs">Configurar gráficas</string>
|
<string name="configure_graphs">Configurar gráficas</string>
|
||||||
<string name="graphs_not_ready">Las gráficas aún no están listas. Inténtelo de nuevo más tarde.</string>
|
<string name="graphs_not_ready">Las gráficas aún no están listas. Inténtelo de nuevo más tarde.</string>
|
||||||
<string name="statistics">Estadísticas</string>
|
<string name="statistics">Estadísticas</string>
|
||||||
@ -283,7 +283,7 @@
|
|||||||
<string name="reject_inproxies">Rechazar proxys de entrada desde Internet</string>
|
<string name="reject_inproxies">Rechazar proxys de entrada desde Internet</string>
|
||||||
<string name="tunnel_summ_reject_inproxies">Permite conectar sólo a usuarios de I2P</string>
|
<string name="tunnel_summ_reject_inproxies">Permite conectar sólo a usuarios de I2P</string>
|
||||||
<string name="unique_local">Direcciones locales únicas</string>
|
<string name="unique_local">Direcciones locales únicas</string>
|
||||||
<string name="tunnel_summ_unique_local">Usa IPs únicas de equipo local (localhost) para cada cliente</string>
|
<string name="tunnel_summ_unique_local">Usa IPs únicas de nodo local (localhost) para cada cliente</string>
|
||||||
<string name="multihome">Alojamiento redundante</string>
|
<string name="multihome">Alojamiento redundante</string>
|
||||||
<string name="tunnel_summ_multihome">Habilita optimizaciones de alojamiento redundante (multihoming)</string>
|
<string name="tunnel_summ_multihome">Habilita optimizaciones de alojamiento redundante (multihoming)</string>
|
||||||
<string name="client_connection_limits">Límites de conexiones de los clientes</string>
|
<string name="client_connection_limits">Límites de conexiones de los clientes</string>
|
||||||
|
@ -173,6 +173,8 @@
|
|||||||
<string name="connections_per_minute">Yhteyksiä minuutissa</string>
|
<string name="connections_per_minute">Yhteyksiä minuutissa</string>
|
||||||
<string name="connections_per_hour">Yhteyksiä tunnissa</string>
|
<string name="connections_per_hour">Yhteyksiä tunnissa</string>
|
||||||
<string name="connections_per_day">Yhteyksiä päivässä</string>
|
<string name="connections_per_day">Yhteyksiä päivässä</string>
|
||||||
|
<string name="num_per_hour">%s per tunti</string>
|
||||||
|
<string name="num_per_day">%s per päivä</string>
|
||||||
<string name="unlimited">Rajoittamaton</string>
|
<string name="unlimited">Rajoittamaton</string>
|
||||||
<string name="num_minutes">%s minuuttia</string>
|
<string name="num_minutes">%s minuuttia</string>
|
||||||
<string name="http_client">HTTP-asiakas</string>
|
<string name="http_client">HTTP-asiakas</string>
|
||||||
|
@ -2,30 +2,40 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">I2P</string>
|
<string name="app_name">I2P</string>
|
||||||
<string name="desc_i2p_logo">Logo I2P</string>
|
<string name="desc_i2p_logo">Logo I2P</string>
|
||||||
|
<string name="choose_language">Escolha um idioma</string>
|
||||||
<string name="welcome_new_install">Bem vindo ao I2P! Este aplicativo está em estágio ALPHA e não provê anonimidade forte. Por favor leia as notas e informações de licença.</string>
|
<string name="welcome_new_install">Bem vindo ao I2P! Este aplicativo está em estágio ALPHA e não provê anonimidade forte. Por favor leia as notas e informações de licença.</string>
|
||||||
<string name="welcome_new_version">Nova versão instalada. Por favor leia as notas de revisão. Versão:</string>
|
<string name="welcome_new_version">Nova versão instalada. Por favor, leia as notas de lançamento. Versão:</string>
|
||||||
<string name="label_home">Controle e status</string>
|
<string name="label_tunnels">Túneis</string>
|
||||||
<string name="label_tunnels">Tuneis</string>
|
|
||||||
<string name="label_status">Estado</string>
|
<string name="label_status">Estado</string>
|
||||||
|
<string name="label_console">Painel</string>
|
||||||
|
<string name="label_addresses">Endereços</string>
|
||||||
<string name="label_addressbook">Livro de endereços</string>
|
<string name="label_addressbook">Livro de endereços</string>
|
||||||
<string name="label_i2ptunnel_client">Túneis clientes</string>
|
<string name="label_i2ptunnel_client">Túneis clientes</string>
|
||||||
<string name="label_i2ptunnel_server">Túneis servidor</string>
|
<string name="label_i2ptunnel_server">Túneis servidor</string>
|
||||||
<string name="label_logs">Registros</string>
|
<string name="label_logs">Registros</string>
|
||||||
<string name="label_error_logs">Registros de erros</string>
|
<string name="label_error_logs">Registros de erros</string>
|
||||||
<string name="label_info_and_pages">Informações e paginas</string>
|
|
||||||
<string name="label_welcome_page">Página de boas-vindas</string>
|
|
||||||
<string name="label_news">Novidades</string>
|
<string name="label_news">Novidades</string>
|
||||||
<string name="label_peers_status">Pares</string>
|
<string name="label_peers_status">Pares</string>
|
||||||
<string name="label_release_notes">Comunicados de lançamento</string>
|
<string name="label_release_notes">Comunicados de lançamento</string>
|
||||||
<string name="label_licenses">Licenças</string>
|
<string name="label_licenses">Licenças</string>
|
||||||
<string name="label_nonanon_info">Informação não-anônima</string>
|
|
||||||
<string name="label_browse">Navegador</string>
|
<string name="label_browse">Navegador</string>
|
||||||
<string name="label_graphs">Gráficos</string>
|
<string name="label_graphs">Gráficos</string>
|
||||||
|
<string name="button_router_graceful">O software I2P será encerrado em %s</string>
|
||||||
|
<string name="no_internet">Sem conexões de internet disponíveis</string>
|
||||||
|
<string name="firewalled">Sob firewall</string>
|
||||||
|
<string name="symmetric_nat">NAT simétrico</string>
|
||||||
|
<!--Parameter is a time, e.g. 32s or 2m-->
|
||||||
|
<string name="net_status_error_private_tcp">Endereço TCP privado</string>
|
||||||
|
<string name="net_status_info_disconnected">Desconectado - verifique a conexão de rede</string>
|
||||||
|
<string name="net_status_error_udp_port">Porta UDP em uso - altere as configurações e reinicie</string>
|
||||||
|
<string name="net_status_error_no_active_peers">Sem pares ativos - verifique a conexão de rede e o firewall</string>
|
||||||
|
<string name="shared_clients">Clientes compartilhados</string>
|
||||||
|
<string name="active_peers">Pares ativos</string>
|
||||||
|
<string name="known_peers">Pares conhecidos</string>
|
||||||
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
|
<!--Character to indicate a client tunnel. Usually first letter of the word "client".-->
|
||||||
<string name="char_client_tunnel">C</string>
|
<string name="char_client_tunnel">C</string>
|
||||||
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
|
<!--Character to indicate a server tunnel. Usually first letter of the word "server".-->
|
||||||
<string name="char_server_tunnel">S</string>
|
<string name="char_server_tunnel">S</string>
|
||||||
<string name="no_client_tunnels_running">Por enquanto, nenhum túnel de cliente em execução.</string>
|
|
||||||
<string name="configure_browser_title">Configurar o navegador?</string>
|
<string name="configure_browser_title">Configurar o navegador?</string>
|
||||||
<string name="configure_browser_for_i2p">Gostaria de configurar um navegador para visualizar sites da I2P? (Você pode também fazer isso depois a partir do menu ajuda.)</string>
|
<string name="configure_browser_for_i2p">Gostaria de configurar um navegador para visualizar sites da I2P? (Você pode também fazer isso depois a partir do menu ajuda.)</string>
|
||||||
<string name="first_start_title">Parabéns em instalar o I2P!</string>
|
<string name="first_start_title">Parabéns em instalar o I2P!</string>
|
||||||
@ -33,13 +43,11 @@
|
|||||||
<string name="first_start_read">Enquanto você está esperando, por favor leia as notas de lançamento e a página de boas vindas.</string>
|
<string name="first_start_read">Enquanto você está esperando, por favor leia as notas de lançamento e a página de boas vindas.</string>
|
||||||
<string name="first_start_faq">Uma vez que você tenha túneis clientes, por favor <b>verifique</b> nosso FAQ:</string>
|
<string name="first_start_faq">Uma vez que você tenha túneis clientes, por favor <b>verifique</b> nosso FAQ:</string>
|
||||||
<string name="first_start_faq_nonanon">Ou use esse link não-anonimo se você não deseja esperar por túneis:</string>
|
<string name="first_start_faq_nonanon">Ou use esse link não-anonimo se você não deseja esperar por túneis:</string>
|
||||||
<string name="first_start_irc">Configure seu cliente IRC para <b>localhost:6668</b> e diga oi para nós:</string>
|
<string name="first_start_irc">Configure seu cliente IRC para <b>localhost:6668</b> e dê um oi para nós:</string>
|
||||||
<string name="action_search">Procurar</string>
|
<string name="action_search">Procurar</string>
|
||||||
<string name="action_add">Adicionar</string>
|
<string name="action_add">Adicionar</string>
|
||||||
<string name="action_edit">Editar</string>
|
<string name="action_edit">Editar</string>
|
||||||
<string name="action_delete">Apagar</string>
|
<string name="action_delete">Apagar</string>
|
||||||
<string name="action_router_start">Iniciar roteamento</string>
|
|
||||||
<string name="action_router_stop">Interrompear roteamento</string>
|
|
||||||
<string name="action_i2ptunnel_start">Iniciar túnel</string>
|
<string name="action_i2ptunnel_start">Iniciar túnel</string>
|
||||||
<string name="action_i2ptunnel_stop">Parar túnel</string>
|
<string name="action_i2ptunnel_stop">Parar túnel</string>
|
||||||
<string name="action_i2ptunnel_start_all">Iniciar todos os túneis</string>
|
<string name="action_i2ptunnel_start_all">Iniciar todos os túneis</string>
|
||||||
@ -51,7 +59,22 @@
|
|||||||
<string name="action_reload_subscriptions">Recarregar inscriçoes</string>
|
<string name="action_reload_subscriptions">Recarregar inscriçoes</string>
|
||||||
<string name="router_not_running">O roteador não está funcionando</string>
|
<string name="router_not_running">O roteador não está funcionando</string>
|
||||||
<string name="stats_not_ready">O configurador de estatística não está pronto. Tente de novo mais tarde.</string>
|
<string name="stats_not_ready">O configurador de estatística não está pronto. Tente de novo mais tarde.</string>
|
||||||
|
<string name="statistics">Estatísticas</string>
|
||||||
|
<string name="routers">Roteadores</string>
|
||||||
|
<string name="countries">Países</string>
|
||||||
|
<string name="country">País</string>
|
||||||
|
<string name="transport">Transporte</string>
|
||||||
|
<string name="versions">Versões</string>
|
||||||
|
<string name="version">Versão</string>
|
||||||
<string name="netdb_routers_empty">Sem roteadores em seu NetDB.</string>
|
<string name="netdb_routers_empty">Sem roteadores em seu NetDB.</string>
|
||||||
|
<string name="notification_status_starting">O roteador I2P está inicializando</string>
|
||||||
|
<string name="notification_status_restarting">O roteador I2P está reiniciando</string>
|
||||||
|
<string name="notification_status_waiting">O roteador I2P está esperando por uma conexão de rede</string>
|
||||||
|
<string name="notification_status_starting_after_waiting">Conectado a rede, inicializando o roteador I2P</string>
|
||||||
|
<string name="notification_status_running">Software I2P em execução</string>
|
||||||
|
<string name="notification_status_client_ready">Os túneis de cliente estão prontos</string>
|
||||||
|
<string name="notification_status_graceful">Interrompendo o roteador I2P em %s</string>
|
||||||
|
<string name="notification_status_stopping">Interrompendo o roteador I2P</string>
|
||||||
<string name="notification_status_bw">Largura de banda: %1$s KBps Down/ %2$s KBps up</string>
|
<string name="notification_status_bw">Largura de banda: %1$s KBps Down/ %2$s KBps up</string>
|
||||||
<string name="notification_status_peers">Pares: %1$d ativos, %2$d conhecidos</string>
|
<string name="notification_status_peers">Pares: %1$d ativos, %2$d conhecidos</string>
|
||||||
<string name="notification_status_expl">Túneis exploratórios: %1$d/%2$d</string>
|
<string name="notification_status_expl">Túneis exploratórios: %1$d/%2$d</string>
|
||||||
@ -104,6 +127,9 @@
|
|||||||
<string name="about_volunteer">Quer ajudar a tornar o aplicativo melhor? Seja voluntário no fórum Android:</string>
|
<string name="about_volunteer">Quer ajudar a tornar o aplicativo melhor? Seja voluntário no fórum Android:</string>
|
||||||
<string name="about_donate">Quer doar dinheiro ou bitcoins para comprar mais dispositivos Android para desenvolvimento e testes? Vá para:</string>
|
<string name="about_donate">Quer doar dinheiro ou bitcoins para comprar mais dispositivos Android para desenvolvimento e testes? Vá para:</string>
|
||||||
<string name="menu_help">Ajuda</string>
|
<string name="menu_help">Ajuda</string>
|
||||||
|
<string name="general">Geral</string>
|
||||||
|
<string name="label_router">Endereços públicos</string>
|
||||||
|
<string name="label_private">Endereços privados</string>
|
||||||
<string name="addressbook_search_header">%s achado</string>
|
<string name="addressbook_search_header">%s achado</string>
|
||||||
<string name="addressbook_add_wizard_k_name">Nome</string>
|
<string name="addressbook_add_wizard_k_name">Nome</string>
|
||||||
<string name="addressbook_add_wizard_k_destination">Destino</string>
|
<string name="addressbook_add_wizard_k_destination">Destino</string>
|
||||||
@ -134,6 +160,8 @@
|
|||||||
<string name="i2ptunnel_wizard_k_desc">Descrição</string>
|
<string name="i2ptunnel_wizard_k_desc">Descrição</string>
|
||||||
<string name="i2ptunnel_wizard_k_dest">Destino</string>
|
<string name="i2ptunnel_wizard_k_dest">Destino</string>
|
||||||
<string name="i2ptunnel_wizard_k_outproxies">Proxys de saída</string>
|
<string name="i2ptunnel_wizard_k_outproxies">Proxys de saída</string>
|
||||||
|
<string name="i2ptunnel_wizard_k_target_host">Host alvo</string>
|
||||||
|
<string name="i2ptunnel_wizard_k_target_port">Porta alvo</string>
|
||||||
<string name="i2ptunnel_wizard_k_auto_start">Auto-início</string>
|
<string name="i2ptunnel_wizard_k_auto_start">Auto-início</string>
|
||||||
<string name="next">Próximo</string>
|
<string name="next">Próximo</string>
|
||||||
<string name="prev">Anterior</string>
|
<string name="prev">Anterior</string>
|
||||||
@ -148,5 +176,76 @@
|
|||||||
<string name="i2ptunnel_wizard_desc_auto_start">O túnel deve iniciar automaticamente quando o roteador iniciar?</string>
|
<string name="i2ptunnel_wizard_desc_auto_start">O túnel deve iniciar automaticamente quando o roteador iniciar?</string>
|
||||||
<string name="i2ptunnel_wizard_submit_confirm_message">Criar túnel?</string>
|
<string name="i2ptunnel_wizard_submit_confirm_message">Criar túnel?</string>
|
||||||
<string name="i2ptunnel_wizard_submit_confirm_button">Criar túnel</string>
|
<string name="i2ptunnel_wizard_submit_confirm_button">Criar túnel</string>
|
||||||
|
<string name="i2ptunnel_view_target">Alvo</string>
|
||||||
|
<string name="i2ptunnel_view_access_point">Ponto de acesso</string>
|
||||||
<string name="i2ptunnel_view_autostart">Auto-início</string>
|
<string name="i2ptunnel_view_autostart">Auto-início</string>
|
||||||
|
<string name="edit_tunnel">Editar túnel</string>
|
||||||
|
<string name="name">Nome</string>
|
||||||
|
<string name="description">Descrição</string>
|
||||||
|
<string name="tunnel_summ_auto_start">Iniciar o túnel na inicialização do roteador.</string>
|
||||||
|
<string name="tunnel_cat_ports">Portas locais</string>
|
||||||
|
<string name="shared_client">Cliente compartilhado</string>
|
||||||
|
<string name="target_destination">Destino alvo</string>
|
||||||
|
<string name="persistent_key">Chave persistente</string>
|
||||||
|
<string name="persistent_key_conflict_title">Desativar novas chaves na reabertura?</string>
|
||||||
|
<string name="persistent_key_conflict_msg">Você não pode ativar chaves persistentes enquanto o túnel estiver configurado para gerar novas chaves na reabertura. Quer desativar novas chaves na reabertura?</string>
|
||||||
|
<string name="tunnel_summ_persistent_key">Manter o destino desse túnel quando ele reiniciar</string>
|
||||||
|
<string name="tunnel_summ_client_ssl">Os clientes devem usar SSL para se conectar</string>
|
||||||
|
<string name="outproxies">Proxies de saída</string>
|
||||||
|
<string name="ssl_outproxies">Proxies de saida com SSL</string>
|
||||||
|
<string name="irc">IRC</string>
|
||||||
|
<string name="enable_dcc">Ativar DCC</string>
|
||||||
|
<string name="tunnel_summ_enable_dcc">Permitir que os clientes IRC usem DCC</string>
|
||||||
|
<string name="website_domain_name">Nome do domínio do site web</string>
|
||||||
|
<string name="target_host">Host alvo</string>
|
||||||
|
<string name="target_port">Porta alvo</string>
|
||||||
|
<string name="use_ssl">Usar SSL</string>
|
||||||
|
<string name="tunnel_summ_use_ssl">Usar SSL para conectar-se ao alvo</string>
|
||||||
|
<string name="tunnel_parameters">Parâmetros de túnel</string>
|
||||||
|
<string name="profile">Perfil</string>
|
||||||
|
<string name="profile_bulk">Conexão em massa (downloads/websites/BT)</string>
|
||||||
|
<string name="profile_interactive">Conexão interativa</string>
|
||||||
|
<string name="tunnel_summ_delay_connect">Ativar para conexões de pedidos/respostas</string>
|
||||||
|
<string name="access_control">Controle de acesso</string>
|
||||||
|
<string name="restricted_access">Acesso restrito</string>
|
||||||
|
<string name="disabled">Desativado</string>
|
||||||
|
<string name="whitelist">Lista de previlégios</string>
|
||||||
|
<string name="blacklist">Lista de proibições</string>
|
||||||
|
<string name="access_list">Lista de acessos</string>
|
||||||
|
<string name="reject_inproxies">Rejeitar proxies de entrada</string>
|
||||||
|
<string name="tunnel_summ_reject_inproxies">Permitir que apenas usuários da I2P se conectem</string>
|
||||||
|
<string name="unique_local">Local único</string>
|
||||||
|
<string name="tunnel_summ_unique_local">Usar IPs de host locais únicos para cada cliente</string>
|
||||||
|
<string name="multihome">Multihome</string>
|
||||||
|
<string name="tunnel_summ_multihome">Ativar otimizações de multihoming</string>
|
||||||
|
<string name="connections_per_minute">Conexões por minuto</string>
|
||||||
|
<string name="connections_per_hour">Conexões por hora</string>
|
||||||
|
<string name="connections_per_day">Conexões por dia</string>
|
||||||
|
<string name="total_connections_per_minute">Total de conexões por minuto</string>
|
||||||
|
<string name="total_connections_per_hour">Total de conexões por hora</string>
|
||||||
|
<string name="total_connections_per_day">Total de conexões por dia</string>
|
||||||
|
<string name="max_active_connections">Número máximo de conexões ativas</string>
|
||||||
|
<string name="num_per_minute">%s por minuto</string>
|
||||||
|
<string name="num_per_hour">%s por hora</string>
|
||||||
|
<string name="num_per_day">%s por dia</string>
|
||||||
|
<string name="unlimited">Ilimitado</string>
|
||||||
|
<string name="set_zero_for_unlimited">Especifique 0 para ilimitado</string>
|
||||||
|
<string name="reduce_quantity">Reduzir quantidade</string>
|
||||||
|
<string name="num_minutes">%s minutos</string>
|
||||||
|
<string name="reduced_tunnel_quantity">Quantidade de túneis reduzida</string>
|
||||||
|
<string name="new_keys_on_reopen">Novas chaves na reabertura</string>
|
||||||
|
<string name="tunnel_summ_allow_ssl">Permitir SSL para endereços I2P</string>
|
||||||
|
<string name="proxy_auth">Autorização de proxy</string>
|
||||||
|
<string name="tunnel_summ_proxy_auth">É necessário um login para usar esse proxy</string>
|
||||||
|
<string name="username">Nome de usuário</string>
|
||||||
|
<string name="password">Senha</string>
|
||||||
|
<string name="outproxy_auth">Autorização de proxy de saída</string>
|
||||||
|
<string name="signature_type">Tipo de assinatura</string>
|
||||||
|
<string name="no_messages">Sem mensagens</string>
|
||||||
|
<string name="no_error_messages">Nenhuma mensagem de erro</string>
|
||||||
|
<string name="log_entry">Entrada no log</string>
|
||||||
|
<string name="copy_logs">Copiar logs</string>
|
||||||
|
<string name="error_logs_copied_to_clipboard">Logs de erro copiados para a área de transferência</string>
|
||||||
|
<string name="logs_copied_to_clipboard">Logs copiados para a área de transferência</string>
|
||||||
|
<string name="label_browser_configuration">Configuração do navegador</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -108,7 +108,7 @@
|
|||||||
<string name="notification_status_stopping_after_net">网络已中断,正在停止 I2P</string>
|
<string name="notification_status_stopping_after_net">网络已中断,正在停止 I2P</string>
|
||||||
<string name="notification_status_shutdown_cancelled">关闭已取消</string>
|
<string name="notification_status_shutdown_cancelled">关闭已取消</string>
|
||||||
<string name="notification_status_shutting_down">I2P 正在关闭</string>
|
<string name="notification_status_shutting_down">I2P 正在关闭</string>
|
||||||
<string name="notification_status_bw">带宽:下行 %1$s KBps / 上行 %2$s KBps </string>
|
<string name="notification_status_bw">带宽:下行 %1$s KB/s / 上行 %2$s KB/s</string>
|
||||||
<string name="notification_status_peers">节点:%1$d 活动,%2$d 已知</string>
|
<string name="notification_status_peers">节点:%1$d 活动,%2$d 已知</string>
|
||||||
<string name="notification_status_expl">探索隧道:%1$d/%2$d</string>
|
<string name="notification_status_expl">探索隧道:%1$d/%2$d</string>
|
||||||
<string name="notification_status_client">客户隧道:%1$d/%2$d</string>
|
<string name="notification_status_client">客户隧道:%1$d/%2$d</string>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<bool name="DEFAULT_PERSISTENT_KEY">false</bool>
|
<bool name="DEFAULT_PERSISTENT_KEY">false</bool>
|
||||||
|
|
||||||
<!-- General advanced -->
|
<!-- General advanced -->
|
||||||
<integer name="DEFAULT_TUNNEL_LENGTH">3</integer>
|
<integer name="DEFAULT_TUNNEL_LENGTH">2</integer>
|
||||||
<integer name="DEFAULT_TUNNEL_VARIANCE">0</integer>
|
<integer name="DEFAULT_TUNNEL_VARIANCE">0</integer>
|
||||||
<integer name="DEFAULT_TUNNEL_QUANTITY">2</integer>
|
<integer name="DEFAULT_TUNNEL_QUANTITY">2</integer>
|
||||||
<integer name="DEFAULT_TUNNEL_BACKUP_QUANTITY">0</integer>
|
<integer name="DEFAULT_TUNNEL_BACKUP_QUANTITY">0</integer>
|
||||||
|
@ -23,6 +23,7 @@ artifacts {
|
|||||||
client file: file('libs/streaming.jar'), builtBy: buildClient
|
client file: file('libs/streaming.jar'), builtBy: buildClient
|
||||||
|
|
||||||
'default' file: file('libs/router.jar'), builtBy: buildRouter
|
'default' file: file('libs/router.jar'), builtBy: buildRouter
|
||||||
|
'default' file: file('libs/newsxml.jar'), builtBy: buildRouter
|
||||||
'default' file: file('libs/i2ptunnel.jar'), builtBy: buildRouter
|
'default' file: file('libs/i2ptunnel.jar'), builtBy: buildRouter
|
||||||
'default' file: file('libs/i2ptunnel-ui.jar'), builtBy: buildRouter
|
'default' file: file('libs/i2ptunnel-ui.jar'), builtBy: buildRouter
|
||||||
'default' file: file('libs/addressbook.jar'), builtBy: buildRouter
|
'default' file: file('libs/addressbook.jar'), builtBy: buildRouter
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
<available property="have.streaming" file="${i2plib}/streaming.jar" />
|
<available property="have.streaming" file="${i2plib}/streaming.jar" />
|
||||||
<available property="have.router" file="${i2plib}/router.jar" />
|
<available property="have.router" file="${i2plib}/router.jar" />
|
||||||
<available property="have.bob" file="${i2plib}/BOB.jar" />
|
<available property="have.bob" file="${i2plib}/BOB.jar" />
|
||||||
|
<available property="have.newsxml" file="${i2pbase}/apps/routerconsole/java/build/newsxml.jar" />
|
||||||
<available property="have.i2ptunnel" file="${i2plib}/i2ptunnel-ui.jar" />
|
<available property="have.i2ptunnel" file="${i2plib}/i2ptunnel-ui.jar" />
|
||||||
<available property="have.addressbook" file="${i2plib}/addressbook.jar" />
|
<available property="have.addressbook" file="${i2plib}/addressbook.jar" />
|
||||||
|
|
||||||
@ -32,6 +33,9 @@
|
|||||||
<ant dir="${i2pbase}" inheritall="false" useNativeBasedir="true" target="buildRouter" />
|
<ant dir="${i2pbase}" inheritall="false" useNativeBasedir="true" target="buildRouter" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
<target name="buildNewsXMLJar" unless="have.newsxml">
|
||||||
|
<ant dir="${i2pbase}" inheritall="false" useNativeBasedir="true" target="buildNewsXMLJar" />
|
||||||
|
</target>
|
||||||
<target name="buildI2PTunnelJar" unless="have.i2ptunnel">
|
<target name="buildI2PTunnelJar" unless="have.i2ptunnel">
|
||||||
<ant dir="${i2pbase}" inheritall="false" useNativeBasedir="true" target="buildI2PTunnelJars" />
|
<ant dir="${i2pbase}" inheritall="false" useNativeBasedir="true" target="buildI2PTunnelJars" />
|
||||||
</target>
|
</target>
|
||||||
@ -61,12 +65,15 @@
|
|||||||
|
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="buildrouter" depends="buildRouter, buildI2PTunnelJar, buildAddressbook, buildBOB">
|
<target name="buildrouter" depends="buildRouter, buildNewsXMLJar, buildI2PTunnelJar, buildAddressbook, buildBOB">
|
||||||
<mkdir dir="${jar.libs.dir}" />
|
<mkdir dir="${jar.libs.dir}" />
|
||||||
|
|
||||||
<!-- router -->
|
<!-- router -->
|
||||||
<copy file="${i2plib}/router.jar" todir="${jar.libs.dir}" />
|
<copy file="${i2plib}/router.jar" todir="${jar.libs.dir}" />
|
||||||
|
|
||||||
|
<!-- newsxml -->
|
||||||
|
<copy file="${i2pbase}/apps/routerconsole/java/build/newsxml.jar" todir="${jar.libs.dir}" />
|
||||||
|
|
||||||
<!-- i2ptunnel -->
|
<!-- i2ptunnel -->
|
||||||
<copy file="${i2plib}/i2ptunnel.jar" todir="${jar.libs.dir}" />
|
<copy file="${i2plib}/i2ptunnel.jar" todir="${jar.libs.dir}" />
|
||||||
<copy file="${i2plib}/i2ptunnel-ui.jar" todir="${jar.libs.dir}" />
|
<copy file="${i2plib}/i2ptunnel-ui.jar" todir="${jar.libs.dir}" />
|
||||||
|
Reference in New Issue
Block a user