MainActivity.java 16.06 KiB
package net.i2p.android.router.activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.text.DecimalFormat;
import net.i2p.android.router.R;
import net.i2p.android.router.service.RouterService;
import net.i2p.android.router.util.Util;
import net.i2p.data.DataHelper;
import net.i2p.router.RouterContext;
public class MainActivity extends I2PActivityBase {
private Handler _handler;
private Runnable _updater;
private Runnable _oneShotUpdate;
private String _savedStatus;
protected static final String PROP_NEW_INSTALL = "i2p.newInstall";
protected static final String PROP_NEW_VERSION = "i2p.newVersion";
protected static final int DIALOG_NEW_INSTALL = 0;
protected static final int DIALOG_NEW_VERSION = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button) findViewById(R.id.news_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), NewsActivity.class);
startActivity(intent);
}
});
b = (Button) findViewById(R.id.releasenotes_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), TextResourceActivity.class);
intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
startActivity(intent);
}
});
b = (Button) findViewById(R.id.licenses_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), LicenseActivity.class);
//Intent intent = new Intent(view.getContext(), TextResourceActivity.class);
//intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.licenses_txt);
startActivity(intent);
}
});
b = (Button) findViewById(R.id.website_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), WebActivity.class);
//intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/").build());
intent.setData(Uri.parse("http://www.i2p2.de/"));
startActivity(intent);
}
});
b = (Button) findViewById(R.id.faq_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), WebActivity.class);
//intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/faq").build());
intent.setData(Uri.parse("http://www.i2p2.de/faq"));
startActivity(intent);
}
});
b = (Button) findViewById(R.id.welcome_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), WebActivity.class);
// default is to display the welcome_html resource
startActivity(intent);
}
});
b = (Button) findViewById(R.id.addressbook_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), AddressbookActivity.class);
startActivity(intent);
}
});
b = (Button) findViewById(R.id.logs_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), LogActivity.class);
startActivity(intent);
}
});
b = (Button) findViewById(R.id.error_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), LogActivity.class);
intent.putExtra(LogActivity.ERRORS_ONLY, true);
startActivity(intent);
}
});
b = (Button) findViewById(R.id.peers_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), PeersActivity.class);
startActivity(intent);
}
});
b = (Button) findViewById(R.id.router_start_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
RouterService svc = _routerService;
if (svc != null && _isBound) {
setPref(PREF_AUTO_START, true);
svc.manualStart();
} else {
startRouter();
}
updateOneShot();
}
});
b = (Button) findViewById(R.id.router_stop_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
RouterService svc = _routerService;
if (svc != null && _isBound) {
setPref(PREF_AUTO_START, false);
svc.manualStop();
updateOneShot();
}
}
});
b = (Button) findViewById(R.id.router_quit_button);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
RouterService svc = _routerService;
if (svc != null && _isBound) {
setPref(PREF_AUTO_START, false);
svc.manualQuit();
updateOneShot();
}
}
});
if (savedInstanceState != null) {
String saved = savedInstanceState.getString("status");
if (saved != null) {
_savedStatus = saved;
}
}
_handler = new Handler();
_updater = new Updater();
_oneShotUpdate = new OneShotUpdate();
}
@Override
public void onStart()
{
super.onStart();
_handler.removeCallbacks(_updater);
_handler.removeCallbacks(_oneShotUpdate);
if (_savedStatus != null) {
TextView tv = (TextView) findViewById(R.id.main_status_text);
tv.setText(_savedStatus);
}
checkDialog();
_handler.postDelayed(_updater, 100);
}
@Override
public void onStop()
{
super.onStop();
_handler.removeCallbacks(_updater);
_handler.removeCallbacks(_oneShotUpdate);
}
@Override
public void onResume()
{
super.onResume();
updateOneShot();
}
@Override
public void onSaveInstanceState(Bundle outState)
{
if (_savedStatus != null)
outState.putString("status", _savedStatus);
super.onSaveInstanceState(outState);
}
private void updateOneShot() {
_handler.postDelayed(_oneShotUpdate, 100);
}
private class OneShotUpdate implements Runnable {
public void run() {
updateVisibility();
updateStatus();
}
}
private class Updater implements Runnable {
private int counter;
public void run() {
updateVisibility();
if (counter++ % 3 == 0)
updateStatus();
_handler.postDelayed(this, 2500);
}
}
private void updateVisibility() {
RouterService svc = _routerService;
boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) &&
Util.isConnected(this);
Button start = (Button) findViewById(R.id.router_start_button);
start.setVisibility(showStart ? View.VISIBLE : View.INVISIBLE);
boolean showStop = svc != null && _isBound && svc.canManualStop();
Button stop = (Button) findViewById(R.id.router_stop_button);
stop.setVisibility(showStop ? View.VISIBLE : View.INVISIBLE);
Button quit = (Button) findViewById(R.id.router_quit_button);
quit.setVisibility(showStop ? View.VISIBLE : View.INVISIBLE);
}
private void updateStatus() {
RouterContext ctx = getRouterContext();
TextView tv = (TextView) findViewById(R.id.main_status_text);
/***
if (!Util.isConnected(this)) {
tv.setText("No Internet connection is available");
tv.setVisibility(View.VISIBLE);
} else ****/ if (ctx != null) {
int active = ctx.commSystem().countActivePeers();
int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0);
int inEx = ctx.tunnelManager().getFreeTunnelCount();
int outEx = ctx.tunnelManager().getOutboundTunnelCount();
int inCl = ctx.tunnelManager().getInboundClientTunnelCount();
int outCl = ctx.tunnelManager().getOutboundClientTunnelCount();
//int part = _context.tunnelManager().getParticipatingCount();
double dLag = ctx.statManager().getRate("jobQueue.jobLag").getRate(60000).getAverageValue();
String jobLag = DataHelper.formatDuration((long) dLag);
String msgDelay = DataHelper.formatDuration(ctx.throttle().getMessageDelay());
String uptime = DataHelper.formatDuration(ctx.router().getUptime());
//String tunnelStatus = _context.throttle().getTunnelStatus();
double inBW = ctx.bandwidthLimiter().getReceiveBps() / 1024;
double outBW = ctx.bandwidthLimiter().getSendBps() / 1024;
// control total width
DecimalFormat fmt;
if (inBW >= 1000 || outBW >= 1000)
fmt = new DecimalFormat("#0");
else if (inBW >= 100 || outBW >= 100)
fmt = new DecimalFormat("#0.0");
else
fmt = new DecimalFormat("#0.00");
String status =
"ROUTER STATUS" +
"\nPeers active/known: " + active + " / " + known +
"\nExploratory Tunnels in/out: " + inEx + " / " + outEx +
"\nClient Tunnels in/out: " + inCl + " / " + outCl;
//" Pt " + part +
String details =
"\nBandwidth in/out: " + fmt.format(inBW) + " / " + fmt.format(outBW) + " KBps" +
"\nMemory: " + DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) +
"B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' +
"\nJob Lag: " + jobLag +
"\nMsg Delay: " + msgDelay +
"\nUptime: " + uptime;
_savedStatus = status + details;
tv.setText(_savedStatus);
tv.setVisibility(View.VISIBLE);
} else {
//tv.setVisibility(View.INVISIBLE);
RouterService svc = _routerService;
String status =
"connected? " + Util.isConnected(this) +
"\nMemory: " + DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) +
"B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' +
"\nhave ctx? " + (ctx != null) +
"\nhave svc? " + (svc != null) +
"\nis bound? " + _isBound +
"\nsvc state: " + (svc == null ? "null" : svc.getState()) +
"\ncan start? " + (svc == null ? "null" : svc.canManualStart()) +
"\ncan stop? " + (svc == null ? "null" : svc.canManualStop());
tv.setText(status);
tv.setVisibility(View.VISIBLE);
}
}
private void checkDialog() {
String oldVersion = getPref(PREF_INSTALLED_VERSION, "??");
if (oldVersion.equals("??")) {
showDialog(DIALOG_NEW_INSTALL);
} else {
String currentVersion = Util.getOurVersion(this);
if (!oldVersion.equals(currentVersion))
showDialog(DIALOG_NEW_VERSION);
}
}
protected Dialog onCreateDialog(int id) {
final String currentVersion = Util.getOurVersion(this);
Dialog rv = null;
AlertDialog.Builder b = new AlertDialog.Builder(this);
switch (id) {
case DIALOG_NEW_INSTALL:
b.setMessage(getResources().getText(R.string.welcome_new_install))
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
setPref(PREF_INSTALLED_VERSION, currentVersion);
dialog.cancel();
MainActivity.this.removeDialog(id);
}
})
.setNeutralButton("Release Notes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
setPref(PREF_INSTALLED_VERSION, currentVersion);
dialog.cancel();
MainActivity.this.removeDialog(id);
Intent intent = new Intent(MainActivity.this, TextResourceActivity.class);
intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
startActivity(intent);
}
})
.setNegativeButton("Licenses", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
setPref(PREF_INSTALLED_VERSION, currentVersion);
dialog.cancel();
MainActivity.this.removeDialog(id);
Intent intent = new Intent(MainActivity.this, LicenseActivity.class);
startActivity(intent);
}
});
rv = b.create();
break;
case DIALOG_NEW_VERSION:
b.setMessage(getResources().getText(R.string.welcome_new_version) + " " + currentVersion)
.setCancelable(true)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
setPref(PREF_INSTALLED_VERSION, currentVersion);
try {
dialog.dismiss();
} catch (Exception e) {}
MainActivity.this.removeDialog(id);
}
})
.setNegativeButton("Release Notes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
setPref(PREF_INSTALLED_VERSION, currentVersion);
try {
dialog.dismiss();
} catch (Exception e) {}
MainActivity.this.removeDialog(id);
Intent intent = new Intent(MainActivity.this, TextResourceActivity.class);
intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
startActivity(intent);
}
});
rv = b.create();
break;
}
return rv;
}
}