From bdbc777a5277e7cfa1d631925881eb177100281a Mon Sep 17 00:00:00 2001
From: str4d <str4d@mail.i2p>
Date: Sun, 18 Aug 2013 00:13:05 +0000
Subject: [PATCH] Added TunnelControllerAdapter, filled tunnel lists with names

Router must be started and client tunnels built before loading the I2PTunnel
Activity, or it hangs when switching tabs.
---
 res/layout/listitem_i2ptunnel.xml             |  1 +
 .../adapter/TunnelControllerAdapter.java      | 41 +++++++++++++++++++
 .../router/fragment/I2PTunnelFragment.java    | 32 +++++++++++++--
 3 files changed, 71 insertions(+), 3 deletions(-)
 create mode 100644 src/net/i2p/android/router/adapter/TunnelControllerAdapter.java

diff --git a/res/layout/listitem_i2ptunnel.xml b/res/layout/listitem_i2ptunnel.xml
index 7e058a0f9..3a37b96d8 100644
--- a/res/layout/listitem_i2ptunnel.xml
+++ b/res/layout/listitem_i2ptunnel.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/row_tunnel_name"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:padding="6dp"
diff --git a/src/net/i2p/android/router/adapter/TunnelControllerAdapter.java b/src/net/i2p/android/router/adapter/TunnelControllerAdapter.java
new file mode 100644
index 000000000..dab0da5da
--- /dev/null
+++ b/src/net/i2p/android/router/adapter/TunnelControllerAdapter.java
@@ -0,0 +1,41 @@
+package net.i2p.android.router.adapter;
+
+import java.util.List;
+
+import net.i2p.android.router.R;
+import net.i2p.i2ptunnel.TunnelController;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
+
+public class TunnelControllerAdapter extends ArrayAdapter<TunnelController> {
+    private final LayoutInflater mInflater;
+
+    public TunnelControllerAdapter(Context context) {
+        super(context, android.R.layout.simple_list_item_2);
+        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+    }
+
+    public void setData(List<TunnelController> controllers) {
+        clear();
+        if (controllers != null) {
+            for (TunnelController controller : controllers) {
+                add(controller);
+            }
+        }
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        View v = mInflater.inflate(R.layout.listitem_i2ptunnel, parent, false);
+        TunnelController controller = getItem(position);
+
+        TextView name = (TextView) v.findViewById(R.id.row_tunnel_name);
+        name.setText(controller.getName());
+
+        return v;
+    }
+}
diff --git a/src/net/i2p/android/router/fragment/I2PTunnelFragment.java b/src/net/i2p/android/router/fragment/I2PTunnelFragment.java
index 989842211..aa61338a0 100644
--- a/src/net/i2p/android/router/fragment/I2PTunnelFragment.java
+++ b/src/net/i2p/android/router/fragment/I2PTunnelFragment.java
@@ -1,6 +1,11 @@
 package net.i2p.android.router.fragment;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import net.i2p.android.router.R;
+import net.i2p.android.router.adapter.TunnelControllerAdapter;
+import net.i2p.i2ptunnel.TunnelController;
 import net.i2p.i2ptunnel.TunnelControllerGroup;
 import android.os.Bundle;
 import android.support.v4.app.ListFragment;
@@ -12,6 +17,7 @@ public class I2PTunnelFragment extends ListFragment {
     public static final String SHOW_CLIENT_TUNNELS = "show_client_tunnels";
 
     private TunnelControllerGroup mGroup;
+    private TunnelControllerAdapter mAdapter;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -22,6 +28,7 @@ public class I2PTunnelFragment extends ListFragment {
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+        mAdapter = new TunnelControllerAdapter(getActivity());
 
         String error;
         try {
@@ -32,17 +39,36 @@ public class I2PTunnelFragment extends ListFragment {
             error = iae.toString();
         }
 
+        boolean clientTunnels = getArguments().getBoolean(SHOW_CLIENT_TUNNELS);
         if (mGroup == null) {
             setEmptyText(error);
-            setListAdapter(null);
         } else {
-            boolean clientTunnels = getArguments().getBoolean(SHOW_CLIENT_TUNNELS);
             if (clientTunnels)
                 setEmptyText("No configured client tunnels.");
             else
                 setEmptyText("No configured server tunnels.");
-            setListAdapter(null);
         }
+        mAdapter.setData(getControllers(clientTunnels));
+        setListAdapter(mAdapter);
+    }
+
+    private List<TunnelController> getControllers(boolean clientTunnels) {
+        List<TunnelController> ret = new ArrayList<TunnelController>();
+        for (TunnelController controller : mGroup.getControllers())
+            if ( (clientTunnels && isClient(controller.getType())) ||
+                 (!clientTunnels && !isClient(controller.getType())) )
+                ret.add(controller);
+        return ret;
+    }
+
+    private static boolean isClient(String type) {
+        return ( ("client".equals(type)) ||
+                 ("httpclient".equals(type)) ||
+                 ("sockstunnel".equals(type)) ||
+                 ("socksirctunnel".equals(type)) ||
+                 ("connectclient".equals(type)) ||
+                 ("streamrclient".equals(type)) ||
+                 ("ircclient".equals(type)));
     }
 
     @Override
-- 
GitLab