From fbf353858eaa5bc2854f64f1d2d2b00a9fe8c13d Mon Sep 17 00:00:00 2001
From: str4d <str4d@mail.i2p>
Date: Wed, 15 Jan 2014 17:45:40 +0000
Subject: [PATCH] Added settings page for logging, config option for default
 log level

---
 res/values/arrays.xml                         |  7 ++
 res/values/strings.xml                        |  2 +
 res/xml/settings_headers.xml                  |  7 ++
 res/xml/settings_headers_legacy.xml           |  6 ++
 .../i2p/android/router/SettingsActivity.java  | 95 ++++++++++++++++---
 5 files changed, 104 insertions(+), 13 deletions(-)

diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 3db19a3ba..a8957cda0 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -17,6 +17,13 @@
         <item>ERROR</item>
         <item>All</item>
     </string-array>
+    <string-array name="log_levels">
+        <item>CRIT</item>
+        <item>ERROR</item>
+        <item>WARN</item>
+        <item>INFO</item>
+        <item>DEBUG</item>
+    </string-array>
     <string-array name="setting0to3">
         <item>0</item>
         <item>1</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a66b5d318..5191f2ee0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -79,6 +79,8 @@
     <string name="settings_desc_sharePercent">Percentage of bandwidth to share (default=80)</string>
     <string name="settings_dialog_sharePercent">Percentage of bandwidth to share</string>
     <string name="settings_desc_upnp">Open firewall ports automatically</string>
+    <string name="settings_label_logging">Logging</string>
+    <string name="settings_label_default_log_level">Default log level</string>
     <string name="settings_label_advanced">Advanced</string>
     <string name="settings_label_transports">Transports</string>
     <string name="settings_label_maxConns">Max connections</string>
diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml
index 0c66f647b..60af72e6b 100644
--- a/res/xml/settings_headers.xml
+++ b/res/xml/settings_headers.xml
@@ -14,6 +14,13 @@
             android:name="settings"
             android:value="graphs" />
     </header>
+    <header
+        android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
+        android:title="@string/settings_label_logging">
+        <extra
+            android:name="settings"
+            android:value="logging" />
+    </header>
     <header
         android:title="@string/label_addressbook">
         <intent
diff --git a/res/xml/settings_headers_legacy.xml b/res/xml/settings_headers_legacy.xml
index 1fe15755b..58ffb507e 100644
--- a/res/xml/settings_headers_legacy.xml
+++ b/res/xml/settings_headers_legacy.xml
@@ -12,6 +12,12 @@
             android:targetClass="net.i2p.android.router.SettingsActivity"
             android:action="net.i2p.android.router.PREFS_GRAPHS" />
     </Preference>
+    <Preference android:title="@string/settings_label_logging">
+        <intent
+            android:targetPackage="net.i2p.android.router"
+            android:targetClass="net.i2p.android.router.SettingsActivity"
+            android:action="net.i2p.android.router.PREFS_LOGGING" />
+    </Preference>
     <Preference android:title="@string/label_addressbook">
         <intent
             android:targetPackage="net.i2p.android.router"
diff --git a/src/net/i2p/android/router/SettingsActivity.java b/src/net/i2p/android/router/SettingsActivity.java
index f1cae352a..e71e85a3e 100644
--- a/src/net/i2p/android/router/SettingsActivity.java
+++ b/src/net/i2p/android/router/SettingsActivity.java
@@ -14,23 +14,29 @@ import android.preference.PreferenceManager;
 import android.preference.PreferenceScreen;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.SortedSet;
+import java.util.TreeSet;
+
 import net.i2p.android.router.R;
 import net.i2p.android.router.util.Util;
 import net.i2p.router.RouterContext;
 import net.i2p.stat.FrequencyStat;
 import net.i2p.stat.Rate;
 import net.i2p.stat.RateStat;
+import net.i2p.stat.StatManager;
+import net.i2p.util.LogManager;
 import net.i2p.util.OrderedProperties;
 
 public class SettingsActivity extends PreferenceActivity {
     // Actions for legacy settings
     private static final String ACTION_PREFS_NET = "net.i2p.android.router.PREFS_NET";
     private static final String ACTION_PREFS_GRAPHS = "net.i2p.android.router.PREFS_GRAPHS";
+    private static final String ACTION_PREFS_LOGGING = "net.i2p.android.router.PREFS_LOGGING";
     private static final String ACTION_PREFS_ADVANCED = "net.i2p.android.router.PREFS_ADVANCED";
 
     @SuppressWarnings("deprecation")
@@ -39,24 +45,40 @@ public class SettingsActivity extends PreferenceActivity {
         super.onCreate(savedInstanceState);
 
         String action = getIntent().getAction();
-        if (action != null && action.equals(ACTION_PREFS_NET)) {
-            addPreferencesFromResource(R.xml.settings_net);
-        } else if (action != null && action.equals(ACTION_PREFS_GRAPHS)) {
-            addPreferencesFromResource(R.xml.settings_graphs);
-            setupGraphSettings(this, getPreferenceScreen());
-        } else if (action != null && action.equals(ACTION_PREFS_ADVANCED)) {
-            addPreferencesFromResource(R.xml.settings_advanced);
+        if (action != null) {
+            if (ACTION_PREFS_NET.equals(action)) {
+                addPreferencesFromResource(R.xml.settings_net);
+            } else if (ACTION_PREFS_GRAPHS.equals(action)){
+                addPreferencesFromResource(R.xml.settings_graphs);
+                RouterContext ctx = getRouterContext();
+                if (ctx != null)
+                    setupGraphSettings(this, getPreferenceScreen(), ctx);
+            } else if (ACTION_PREFS_LOGGING.equals(action)) {
+                addPreferencesFromResource(R.xml.settings_logging);
+                RouterContext ctx = getRouterContext();
+                if (ctx != null)
+                    setupLoggingSettings(this, getPreferenceScreen(), ctx);
+            } else if (ACTION_PREFS_ADVANCED.equals(action)) {
+                addPreferencesFromResource(R.xml.settings_advanced);
+            }
         } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
             // Load the legacy preferences headers
             addPreferencesFromResource(R.xml.settings_headers_legacy);
         }
     }
 
-    protected static void setupGraphSettings(Context context, PreferenceScreen ps) {
+    protected static RouterContext getRouterContext() {
         List<RouterContext> contexts = RouterContext.listContexts();
         if ( !((contexts == null) || (contexts.isEmpty())) ) {
-            RouterContext _context = contexts.get(0);
-            Map<String, SortedSet<String>> all = _context.statManager().getStatsByGroup();
+            return contexts.get(0);
+        }
+        return null;
+    }
+
+    protected static void setupGraphSettings(Context context, PreferenceScreen ps, RouterContext ctx) {
+        if (ctx != null) {
+            StatManager mgr = ctx.statManager();
+            Map<String, SortedSet<String>> all = mgr.getStatsByGroup();
             for (String group : all.keySet()) {
                 SortedSet<String> stats = all.get(group);
                 if (stats.size() == 0) continue;
@@ -69,7 +91,7 @@ public class SettingsActivity extends PreferenceActivity {
                     String description;
                     boolean canBeGraphed = false;
                     boolean currentIsGraphed = false;
-                    RateStat rs = _context.statManager().getRate(stat);
+                    RateStat rs = mgr.getRate(stat);
                     if (rs != null) {
                         description = rs.getDescription();
                         long period = rs.getPeriods()[0]; // should be the minimum
@@ -82,7 +104,7 @@ public class SettingsActivity extends PreferenceActivity {
                             }
                         }
                     } else {
-                        FrequencyStat fs = _context.statManager().getFrequency(stat);
+                        FrequencyStat fs = mgr.getFrequency(stat);
                         if (fs != null) {
                             key = stat;
                             description = fs.getDescription();
@@ -110,6 +132,17 @@ public class SettingsActivity extends PreferenceActivity {
         }
     }
 
+    protected static void setupLoggingSettings(Context context, PreferenceScreen ps, RouterContext ctx) {
+        if (ctx != null) {
+            LogManager mgr = ctx.logManager();
+            // TODO: Add other log config settings
+        } else {
+            PreferenceCategory noRouter = new PreferenceCategory(context);
+            noRouter.setTitle(R.string.router_not_running);
+            ps.addPreference(noRouter);
+        }
+    }
+
     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
     @Override
     public void onBuildHeaders(List<Header> target) {
@@ -131,6 +164,9 @@ public class SettingsActivity extends PreferenceActivity {
         // List to store stats for graphing
         List<String> statSummaries = new ArrayList<String>();
 
+        // List to store Log settings
+        Map<String, String> logSettings = new HashMap<String, String>();
+
         Map<String, ?> all = preferences.getAll();
         Iterator<String> iterator = all.keySet().iterator();
         // get values from the Map and make them strings.
@@ -151,6 +187,8 @@ public class SettingsActivity extends PreferenceActivity {
                 if (checked.equals("true")) {
                     statSummaries.add(stat);
                 }
+            } else if ( x.startsWith("logger.")) {
+                logSettings.put(x, all.get(x).toString());
             } else if(! x.startsWith("DO_NOT_SAVE")) {
                 // Disabled?
                 @SuppressWarnings("deprecation")
@@ -191,10 +229,34 @@ public class SettingsActivity extends PreferenceActivity {
         if ( !((contexts == null) || (contexts.isEmpty())) ) {
             RouterContext _context = contexts.get(0);
             _context.router().saveConfig(props, null);
+
+            // Merge in new log settings
+            saveLoggingChanges(_context, logSettings);
         }
+
+        // Store the settings in Android
         super.onPause();
     }
 
+    private void saveLoggingChanges(RouterContext ctx, Map<String, String> logSettings) {
+        boolean shouldSave = false;
+
+        for (String key : logSettings.keySet()) {
+            if ("logger.defaultLevel".equals(key)) {
+                String defaultLevel = logSettings.get(key);
+                String oldDefault = ctx.logManager().getDefaultLimit();
+                if (!defaultLevel.equals(oldDefault)) {
+                    shouldSave = true;
+                    ctx.logManager().setDefaultLimit(defaultLevel);
+                }
+            }
+        }
+
+        if (shouldSave) {
+            ctx.logManager().saveConfig();
+        }
+    }
+
     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
     public static class SettingsFragment extends PreferenceFragment {
         @Override
@@ -206,7 +268,14 @@ public class SettingsActivity extends PreferenceActivity {
                 addPreferencesFromResource(R.xml.settings_net);
             } else if ("graphs".equals(settings)) {
                 addPreferencesFromResource(R.xml.settings_graphs);
-                setupGraphSettings(getActivity(), getPreferenceScreen());
+                RouterContext ctx = getRouterContext();
+                if (ctx != null)
+                    setupGraphSettings(getActivity(), getPreferenceScreen(), ctx);
+            } else if ("logging".equals(settings)) {
+                addPreferencesFromResource(R.xml.settings_logging);
+                RouterContext ctx = getRouterContext();
+                if (ctx != null)
+                    setupLoggingSettings(getActivity(), getPreferenceScreen(), ctx);
             } else if ("advanced".equals(settings)) {
                 addPreferencesFromResource(R.xml.settings_advanced);
             }
-- 
GitLab