From c92d881a51945034eee82e842e014e0e912fa7e1 Mon Sep 17 00:00:00 2001
From: str4d <str4d@mail.i2p>
Date: Sat, 28 Sep 2013 12:11:30 +0000
Subject: [PATCH] Dynamically fetch current list of graphs

---
 res/values/arrays.xml                         |  6 --
 .../router/activity/GraphActivity.java        | 71 ++++++++++++++-----
 .../router/service/StatSummarizer.java        |  3 +
 3 files changed, 56 insertions(+), 24 deletions(-)

diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index d9ec951ec..3db19a3ba 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -17,12 +17,6 @@
         <item>ERROR</item>
         <item>All</item>
     </string-array>
-    <string-array name="graph_list">
-        <item>router.activePeers</item>
-        <item>router.memoryUsed</item>
-        <item>bw.sendRate</item>
-        <item>bw.recvRate</item>
-    </string-array>
     <string-array name="setting0to3">
         <item>0</item>
         <item>1</item>
diff --git a/src/net/i2p/android/router/activity/GraphActivity.java b/src/net/i2p/android/router/activity/GraphActivity.java
index e3e95e694..402ee6ff7 100644
--- a/src/net/i2p/android/router/activity/GraphActivity.java
+++ b/src/net/i2p/android/router/activity/GraphActivity.java
@@ -1,7 +1,15 @@
 package net.i2p.android.router.activity;
 
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.TreeSet;
+
 import net.i2p.android.router.R;
 import net.i2p.android.router.fragment.GraphFragment;
+import net.i2p.android.router.service.StatSummarizer;
+import net.i2p.android.router.service.SummaryListener;
+import net.i2p.stat.Rate;
 import android.os.Bundle;
 import android.support.v7.app.ActionBar;
 import android.widget.ArrayAdapter;
@@ -20,27 +28,43 @@ public class GraphActivity extends I2PActivityBase {
 
         mDrawerToggle.setDrawerIndicatorEnabled(false);
 
-        SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this,
-                R.array.graph_list, android.R.layout.simple_spinner_dropdown_item);
-
-        ActionBar.OnNavigationListener mNavigationListener = new ActionBar.OnNavigationListener() {
-            String[] rates = getResources().getStringArray(R.array.graph_list);
-            
-            public boolean onNavigationItemSelected(int position, long itemId) {
-                String rateName = rates[position];
-                long period = (60 * 1000);
-                GraphFragment f = GraphFragment.newInstance(rateName, period);
-                getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.main_fragment, f, rates[position]).commit();
-                return true;
+        if (StatSummarizer.instance() != null) {
+            List<SummaryListener> listeners = StatSummarizer.instance().getListeners();
+            TreeSet<SummaryListener> ordered = new TreeSet<SummaryListener>(new AlphaComparator());
+            ordered.addAll(listeners);
+            final String[] mRates = new String[ordered.size()];
+            final long[] mPeriods = new long[ordered.size()];
+            int i = 0;
+            for (SummaryListener listener : ordered) {
+                Rate r = listener.getRate();
+                mRates[i] = r.getRateStat().getName();
+                mPeriods[i] = r.getPeriod();
+                i++;
             }
-        };
 
-        actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationListener);
+            SpinnerAdapter mSpinnerAdapter = new ArrayAdapter<String>(this,
+                    android.R.layout.simple_spinner_dropdown_item, mRates);
+
+            ActionBar.OnNavigationListener mNavigationListener = new ActionBar.OnNavigationListener() {
+                String[] rates = mRates;
+                long[] periods = mPeriods;
+
+                public boolean onNavigationItemSelected(int position, long itemId) {
+                    String rateName = rates[position];
+                    long period = periods[position];
+                    GraphFragment f = GraphFragment.newInstance(rateName, period);
+                    getSupportFragmentManager().beginTransaction()
+                    .replace(R.id.main_fragment, f, rates[position]).commit();
+                    return true;
+                }
+            };
+
+            actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationListener);
 
-        if (savedInstanceState != null) {
-            int selected = savedInstanceState.getInt(SELECTED_RATE);
-            actionBar.setSelectedNavigationItem(selected);
+            if (savedInstanceState != null) {
+                int selected = savedInstanceState.getInt(SELECTED_RATE);
+                actionBar.setSelectedNavigationItem(selected);
+            }
         }
     }
 
@@ -50,4 +74,15 @@ public class GraphActivity extends I2PActivityBase {
         outState.putInt(SELECTED_RATE,
                 getSupportActionBar().getSelectedNavigationIndex());
     }
+
+    private static class AlphaComparator implements Comparator<SummaryListener> {
+        public int compare(SummaryListener l, SummaryListener r) {
+            String lName = l.getRate().getRateStat().getName();
+            String rName = r.getRate().getRateStat().getName();
+            int rv = lName.compareTo(rName);
+            if (rv != 0)
+                return rv;
+            return (int) (l.getRate().getPeriod() - r.getRate().getPeriod());
+        }
+    }
 }
diff --git a/src/net/i2p/android/router/service/StatSummarizer.java b/src/net/i2p/android/router/service/StatSummarizer.java
index f18d6f564..2af37f916 100644
--- a/src/net/i2p/android/router/service/StatSummarizer.java
+++ b/src/net/i2p/android/router/service/StatSummarizer.java
@@ -35,6 +35,9 @@ public class StatSummarizer implements Runnable {
         }
     }
 
+    /** list of SummaryListener instances */
+    public List<SummaryListener> getListeners() { return _listeners; }
+
     public SummaryListener getListener(String rateName, long period) {
         for (SummaryListener lsnr : _listeners) {
             if (lsnr.getName().equals(rateName + "." + period))
-- 
GitLab