diff --git a/briar-android/res/drawable/transport_bt.xml b/briar-android/res/drawable/transport_bt.xml
new file mode 100644
index 000000000..d22170869
--- /dev/null
+++ b/briar-android/res/drawable/transport_bt.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/briar-android/res/drawable/transport_lan.xml b/briar-android/res/drawable/transport_lan.xml
new file mode 100644
index 000000000..d2cc9189e
--- /dev/null
+++ b/briar-android/res/drawable/transport_lan.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/briar-android/res/drawable/transport_tor.xml b/briar-android/res/drawable/transport_tor.xml
new file mode 100644
index 000000000..fe462b2f7
--- /dev/null
+++ b/briar-android/res/drawable/transport_tor.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/briar-android/res/layout/list_item_transport.xml b/briar-android/res/layout/list_item_transport.xml
new file mode 100644
index 000000000..11c3d5e4d
--- /dev/null
+++ b/briar-android/res/layout/list_item_transport.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/res/layout/transports_list.xml b/briar-android/res/layout/transports_list.xml
new file mode 100644
index 000000000..02c05e74d
--- /dev/null
+++ b/briar-android/res/layout/transports_list.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index 85fe74090..bdcf26104 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -117,9 +117,9 @@
Offline
Send
Data Transports
- Internet via Tor
+ Internet
Bluetooth
- Local Area Network
+ Wi-Fi
Lost password
diff --git a/briar-android/src/org/briarproject/android/DashboardActivity.java b/briar-android/src/org/briarproject/android/DashboardActivity.java
index b499c6794..6e08cd217 100644
--- a/briar-android/src/org/briarproject/android/DashboardActivity.java
+++ b/briar-android/src/org/briarproject/android/DashboardActivity.java
@@ -1,17 +1,21 @@
package org.briarproject.android;
+import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
+import android.widget.TextView;
import org.briarproject.R;
import org.briarproject.android.contact.ContactListActivity;
@@ -25,10 +29,8 @@ import org.briarproject.api.db.DbException;
import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener;
-import org.briarproject.api.event.TransportAddedEvent;
import org.briarproject.api.event.TransportDisabledEvent;
import org.briarproject.api.event.TransportEnabledEvent;
-import org.briarproject.api.event.TransportRemovedEvent;
import org.briarproject.api.plugins.Plugin;
import org.briarproject.api.plugins.PluginManager;
@@ -40,6 +42,7 @@ import javax.inject.Inject;
import static android.view.Gravity.CENTER;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
import static org.briarproject.android.util.CommonLayoutParams.MATCH_MATCH;
@@ -49,6 +52,9 @@ public class DashboardActivity extends BriarActivity implements EventListener {
private static final Logger LOG =
Logger.getLogger(DashboardActivity.class.getName());
+ private List transports;
+ private BaseAdapter transportsAdapter;
+
@Inject private ReferenceManager referenceManager;
@Inject private PluginManager pluginManager;
@@ -89,11 +95,13 @@ public class DashboardActivity extends BriarActivity implements EventListener {
if (LOG.isLoggable(INFO)) {
LOG.info("TransportEnabledEvent: " + id.getString());
}
+ setTransport(id, true);
} else if (e instanceof TransportDisabledEvent) {
TransportId id = ((TransportDisabledEvent) e).getTransportId();
if (LOG.isLoggable(INFO)) {
LOG.info("TransportDisabledEvent: " + id.getString());
}
+ setTransport(id, false);
}
}
@@ -185,8 +193,14 @@ public class DashboardActivity extends BriarActivity implements EventListener {
int pad = LayoutUtils.getPadding(this);
+ LinearLayout layout = new LinearLayout(this);
+ layout.setLayoutParams(MATCH_MATCH);
+ layout.setOrientation(LinearLayout.VERTICAL);
+
GridView grid = new GridView(this);
- grid.setLayoutParams(matchMatch);
+ LinearLayout.LayoutParams params =
+ new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT, 1f);
+ grid.setLayoutParams(params);
grid.setGravity(CENTER);
grid.setPadding(pad, pad, pad, pad);
Resources res = getResources();
@@ -211,7 +225,21 @@ public class DashboardActivity extends BriarActivity implements EventListener {
return buttons.get(position);
}
});
- setContentView(grid);
+ layout.addView(grid);
+
+ // inflate transports layout
+ LayoutInflater inflater = (LayoutInflater) getSystemService
+ (Context.LAYOUT_INFLATER_SERVICE);
+ ViewGroup transportsLayout = (ViewGroup) inflater.
+ inflate(R.layout.transports_list, layout);
+
+ initializeTransports();
+
+ GridView transportsView = (GridView) transportsLayout.findViewById(
+ R.id.transportsView);
+ transportsView.setAdapter(transportsAdapter);
+
+ setContentView(layout);
}
private void showSpinner() {
@@ -247,4 +275,105 @@ public class DashboardActivity extends BriarActivity implements EventListener {
}
});
}
+
+ private void initializeTransports() {
+ transports = new ArrayList(3);
+
+ Transport tor = new Transport();
+ tor.id = new TransportId("tor");
+ Plugin torPlugin = pluginManager.getPlugin(tor.id);
+ if (torPlugin == null) tor.enabled = false;
+ else tor.enabled = torPlugin.isRunning();
+ tor.iconId = R.drawable.transport_tor;
+ tor.textId = R.string.transport_tor;
+ transports.add(tor);
+
+ Transport bt = new Transport();
+ bt.id = new TransportId("bt");
+ Plugin btPlugin = pluginManager.getPlugin(bt.id);
+ if (btPlugin == null) bt.enabled = false;
+ else bt.enabled = btPlugin.isRunning();
+ bt.iconId = R.drawable.transport_bt;
+ bt.textId = R.string.transport_bt;
+ transports.add(bt);
+
+ Transport lan = new Transport();
+ lan.id = new TransportId("lan");
+ Plugin lanPlugin = pluginManager.getPlugin(lan.id);
+ if (lanPlugin == null) lan.enabled = false;
+ else lan.enabled = lanPlugin.isRunning();
+ lan.iconId = R.drawable.transport_lan;
+ lan.textId = R.string.transport_lan;
+ transports.add(lan);
+
+ transportsAdapter = new BaseAdapter() {
+ @Override
+ public int getCount() {
+ return transports.size();
+ }
+
+ @Override
+ public Transport getItem(int position) {
+ return transports.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ @Override
+ public View getView(int position, View convertView,
+ ViewGroup parent) {
+ LayoutInflater inflater = (LayoutInflater) getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ ViewGroup view = (ViewGroup) inflater
+ .inflate(R.layout.list_item_transport, parent, false);
+
+ Transport t = getItem(position);
+ Resources r = getResources();
+
+ int c;
+ if (t.enabled) {
+ c = r.getColor(R.color.briar_green_light);
+ } else {
+ c = r.getColor(android.R.color.tertiary_text_light);
+ }
+
+ ImageView icon = (ImageView) view.findViewById(R.id.imageView);
+ icon.setImageDrawable(r.getDrawable(t.iconId));
+ icon.setColorFilter(c);
+
+ TextView text = (TextView) view.findViewById(R.id.textView);
+ text.setText(getString(t.textId));
+ text.setTextColor(c);
+
+ return view;
+ }
+ };
+ }
+
+ private void setTransport(final TransportId id, final boolean enabled) {
+ runOnUiThread(new Runnable() {
+ public void run() {
+ if (transports == null || transportsAdapter == null) return;
+
+ for (Transport t : transports) {
+ if (t.id.equals(id)) {
+ t.enabled = enabled;
+ break;
+ }
+ }
+
+ transportsAdapter.notifyDataSetChanged();
+ }
+ });
+ }
+
+ private static class Transport {
+ TransportId id;
+ boolean enabled;
+ int iconId;
+ int textId;
+ }
}