service: Logging of console output to UI
Change-Id: I89fb0c0672581c1723a2216e63d7fd2be0e2f6e1
Refs: #2434
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9fad6dd..b562532 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -21,8 +21,12 @@
</activity>
<activity
- android:name=".NfdSettingsActivity"
- android:label="@string/app_name" >
+ android:name=".NfdLogActivity"
+ android:label="@string/nfd_logger" />
+
+ <activity
+ android:name=".NfdLogSettingsActivity"
+ android:label="@string/nfd_log_settings" >
</activity>
<service
diff --git a/app/src/main/java/net/named_data/nfd/G.java b/app/src/main/java/net/named_data/nfd/G.java
index cacbecc..7310854 100644
--- a/app/src/main/java/net/named_data/nfd/G.java
+++ b/app/src/main/java/net/named_data/nfd/G.java
@@ -38,7 +38,7 @@
private static final String TAG = "NFDService";
/**
- * Designated log message method that provides flexibility in message logging.
+ * @brief Designated log message method that provides flexibility in message logging.
*
* @param tag Tag to identify log message.
* @param format Format qualifiers as used in String.format()
@@ -51,7 +51,7 @@
}
/**
- * Convenience method to log a message with a specified tag.
+ * @brief Convenience method to log a message with a specified tag.
*
* @param tag Tag to identify log message.
* @param message Output log message.
@@ -61,7 +61,7 @@
}
/**
- * Convenience method to log messages with the default tag.
+ * @brief Convenience method to log messages with the default tag.
*
* @param message Output log message.
*/
@@ -69,4 +69,11 @@
Log(TAG, message);
}
+ /**
+ * @brief Gets the tag in which logs are posted with.
+ * @return TAG that is used by this log class.
+ */
+ public static String getLogTag() {
+ return TAG;
+ }
}
diff --git a/app/src/main/java/net/named_data/nfd/NfdLogActivity.java b/app/src/main/java/net/named_data/nfd/NfdLogActivity.java
new file mode 100644
index 0000000..e7552f1
--- /dev/null
+++ b/app/src/main/java/net/named_data/nfd/NfdLogActivity.java
@@ -0,0 +1,286 @@
+/**
+ * Copyright (c) 2015 Regents of the University of California
+ *
+ * This file is part of NFD (Named Data Networking Forwarding Daemon) Android.
+ * See AUTHORS.md for complete list of NFD Android authors and contributors.
+ *
+ * NFD Android is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NFD Android, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.named_data.nfd;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.ActionBarActivity;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+
+/**
+ * @brief Display of NfdService's logcat output for easy debugging
+ */
+public class NfdLogActivity extends ActionBarActivity {
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.menu_log, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_log_settings:
+ startActivity(new Intent(this, NfdLogSettingsActivity.class));
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_log);
+
+ // Get UI Elements
+ m_logListView = (ListView) findViewById(R.id.log_output);
+ m_logListAdapter = new LogListAdapter(getLayoutInflater(), s_logMaxLines);
+ m_logListView.setAdapter(m_logListAdapter);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ startLogging();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ stopLogging();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ G.Log("LogActivity::onDestroy()");
+ }
+
+ /**
+ * @brief Starts logging by spawning a new thread to capture logs.
+ */
+ private void startLogging() {
+ // Clear output, update UI and get tag arguments
+ clearLogOutput();
+ appendLogText(getString(R.string.loading_logger));
+ m_tagArguments = NfdLogTagUtil.getTags(this);
+
+ new Thread(){
+ @Override
+ public void run() {
+ captureLog();
+ G.Log("Thread done capturing logs.");
+ }
+ }.start();
+ }
+
+ /**
+ * @brief Stops the logging by killing the process running logcat.
+ */
+ private void stopLogging() {
+ // Kill process
+ m_logProcess.destroy();
+ }
+
+ /**
+ * @brief Clear log adapter and update UI.
+ */
+ private void clearLogOutput() {
+ m_logListAdapter.clearMessages();
+ }
+
+ /**
+ * @brief Convenience method to append a message to the log output
+ * and scroll to the bottom of the log.
+ *
+ * @param message String message to be posted to the text view.
+ */
+ private void appendLogText(String message) {
+ m_logListAdapter.addMessage(message);
+ m_logListView.setSelection(m_logListAdapter.getCount() - 1);
+ }
+
+ /**
+ * @brief Convenience method to capture the output from logcat.
+ */
+ private void captureLog() {
+ try {
+ /**
+ * NOTE: The use of the 'time' log output format is hard
+ * coded for now. This option is similar to that of the
+ * log output that is seen in Android Studio and Eclipse.
+ *
+ * In the future this value can be user configurable or
+ * placed in the log preference settings.
+ */
+ // Build command for execution
+ String cmd = String.format("%s -v time %s *:S",
+ "logcat",
+ m_tagArguments);
+
+ G.Log("LogCat Command: " + cmd);
+
+ m_logProcess = Runtime.getRuntime().exec(cmd);
+ BufferedReader in = new BufferedReader(
+ new InputStreamReader(m_logProcess.getInputStream()));
+
+ String line;
+ while ((line = in.readLine()) != null) {
+ final String message = line;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ appendLogText(message);
+ }
+ });
+ }
+
+ // Wait for process to join this thread
+ m_logProcess.waitFor();
+ } catch (IOException e) {
+ G.Log("captureLog(): " + e);
+ } catch (InterruptedException e) {
+ G.Log("captureLog(): " + e);
+ }
+ }
+
+ /**
+ * @brief Custom LogListAdapter to limit the number of log lines that
+ * is being stored and displayed.
+ */
+ private static class LogListAdapter extends BaseAdapter {
+
+ /**
+ * @brief Create a ListView compatible adapter with an
+ * upper bound on the maximum number of entries that will
+ * be displayed in the ListView.
+ *
+ * @param maxLines Maximum number of entries allowed in
+ * the ListView for this adapter.
+ */
+ public LogListAdapter(LayoutInflater layoutInflater, int maxLines) {
+ m_data = new ArrayList<String>();
+ m_layoutInflater = layoutInflater;
+ m_maxLines = maxLines;
+ }
+
+ /**
+ * @brief Add a message to be displayed in the log's list view.
+ *
+ * @param message Message to be added to the underlying data store
+ * and displayed on thi UI.
+ */
+ public void addMessage(String message) {
+ if (m_data.size() == m_maxLines) {
+ m_data.get(0);
+ }
+
+ m_data.add(message);
+ notifyDataSetChanged();
+ }
+
+ /**
+ * @brief Convenience method to clear all messages from the underlying
+ * data store and update the UI.
+ */
+ public void clearMessages() {
+ m_data.clear();
+ this.notifyDataSetChanged();
+ }
+
+ @Override
+ public int getCount() {
+ return m_data.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return m_data.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ LogEntryViewHolder holder;
+
+ if (convertView == null) {
+ holder = new LogEntryViewHolder();
+
+ convertView = m_layoutInflater.inflate(R.layout.log_item, null);
+ convertView.setTag(holder);
+
+ holder.logLineTextView = (TextView) convertView.findViewById(R.id.log_line);
+ } else {
+ holder = (LogEntryViewHolder) convertView.getTag();
+ }
+
+ holder.logLineTextView.setText(m_data.get(position));
+ return convertView;
+ }
+
+ /** Underlying message data store for log messages*/
+ private ArrayList<String> m_data;
+
+ /** Layout inflater for inflating views */
+ private LayoutInflater m_layoutInflater;
+
+ /** Maximum number of log lines to display */
+ private int m_maxLines;
+ }
+
+ /**
+ * @brief Log entry view holder object for holding the output.
+ */
+ private static class LogEntryViewHolder {
+ public TextView logLineTextView;
+ }
+
+ /** @brief Maximum number of log lines to be displayed */
+ private static final int s_logMaxLines = 380;
+
+ /** @brief Process in which logcat is running in */
+ private Process m_logProcess;
+
+ /** @brief ListView for displaying log output in */
+ private ListView m_logListView;
+
+ /** @brief Customized ListAdapter for controlling log output */
+ private LogListAdapter m_logListAdapter;
+
+ /** @brief Tag argument to logcat */
+ private String m_tagArguments;
+}
diff --git a/app/src/main/java/net/named_data/nfd/NfdLogSettingsActivity.java b/app/src/main/java/net/named_data/nfd/NfdLogSettingsActivity.java
new file mode 100644
index 0000000..a86ca6f
--- /dev/null
+++ b/app/src/main/java/net/named_data/nfd/NfdLogSettingsActivity.java
@@ -0,0 +1,249 @@
+/**
+ * Copyright (c) 2015 Regents of the University of California
+ *
+ * This file is part of NFD (Named Data Networking Forwarding Daemon) Android.
+ * See AUTHORS.md for complete list of NFD Android authors and contributors.
+ *
+ * NFD Android is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NFD Android, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.named_data.nfd;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceManager;
+import android.preference.PreferenceScreen;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NfdLogSettingsActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ getFragmentManager().
+ beginTransaction().
+ replace(android.R.id.content, new NfdLogSettingsFragment()).
+ commit();
+ }
+
+ @SuppressLint("ValidFragment")
+ private static class NfdLogSettingsFragment extends PreferenceFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Load the preferences from an XML resource
+ addPreferencesFromResource(R.xml.pref_nfd_log);
+
+ PreferenceScreen preferenceScreen = getPreferenceScreen();
+
+ //// NOTE: This section of code demonstrates how a preference can
+ //// be added programmatically.
+ ////
+ // Creating and inserting a preference programmatically
+ // Preference customPreference = preferenceScreen.
+ // findPreference(getString(R.string.pref_category_title_tags_key));
+ // if (customPreference instanceof PreferenceCategory) {
+ // ListPreference listPreference = new ListPreference(getActivity());
+ // listPreference.setKey("NFDTest_Key");
+ // listPreference.setTitle("NFDTest");
+ // listPreference.setDefaultValue("I");
+ // listPreference.setNegativeButtonText(null);
+ // listPreference.setDialogTitle("NFDTest");
+
+ // String [] keys = getResources().getStringArray(R.array.pref_log_levels);
+ // String [] values = getResources().getStringArray(R.array.pref_log_level_values);
+
+ // listPreference.setEntries(keys);
+ // listPreference.setEntryValues(values);
+
+ // ((PreferenceCategory) customPreference).addPreference(listPreference);
+ // }
+
+ // Collect all Preference in the hierarchy
+ m_tagListPreferences = new ArrayList<ListPreference>();
+ extractPreferences(m_tagListPreferences,
+ (PreferenceGroup) preferenceScreen.
+ findPreference(getString(R.string.pref_category_title_tags_key)));
+
+ // Set all preference setting
+ m_resetPreference = preferenceScreen.
+ findPreference(getString(R.string.pref_tags_log_level_key));
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ registerListeners();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ unregisterPreferenceListeners();
+ saveTagArguments();
+ }
+
+ /**
+ * @brief Convenience method to register preference listeners.
+ */
+ private void registerListeners() {
+ for (Preference p : m_tagListPreferences) {
+ if (p instanceof ListPreference) {
+ registerPreferenceListener(p);
+ }
+ }
+
+ m_resetPreference.setOnPreferenceChangeListener(m_setAllPreferenceChangeListener);
+ }
+
+ /**
+ * @brief Convenience method to unregister preference listeners.
+ */
+ private void unregisterPreferenceListeners() {
+ for (Preference p : m_tagListPreferences) {
+ if (p instanceof ListPreference) {
+ unregisterPreferenceListener(p);
+ }
+ }
+
+ m_resetPreference.setOnPreferenceChangeListener(null);
+ }
+
+ /**
+ * @brief Register preference listener and fire an update.
+ *
+ * @param preference Preference to register listener.
+ */
+ private void registerPreferenceListener(Preference preference) {
+ // Attach listener
+ preference.setOnPreferenceChangeListener(m_tagPreferenceChangeListener);
+
+ // Trigger update
+ m_tagPreferenceChangeListener.onPreferenceChange(preference,
+ PreferenceManager.
+ getDefaultSharedPreferences(preference.getContext()).
+ getString(preference.getKey(), ""));
+ }
+
+ /**
+ * @brief Unregister preference listener for the given preference.
+ *
+ * @param preference Preference to unregister listener.
+ */
+ private void unregisterPreferenceListener(Preference preference) {
+ // Remove listener
+ preference.setOnPreferenceChangeListener(null);
+ }
+
+ /**
+ * @brief Convenience method that extracts all list preferences within a hierarchy
+ * recursively.
+ *
+ * @param list List to add preference to
+ * @param preferenceGroup Root preference group to begin search from
+ */
+ private void extractPreferences(List<ListPreference> list, PreferenceGroup preferenceGroup) {
+ for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) {
+ final Preference preference = preferenceGroup.getPreference(i);
+
+ if (preference instanceof ListPreference) {
+ list.add((ListPreference) preference);
+ } else if (preference instanceof PreferenceGroup) {
+ extractPreferences(list, (PreferenceGroup) preference);
+ }
+ }
+ }
+
+ /**
+ * @brief Save tag arguments for quick retrieval.
+ */
+ private void saveTagArguments() {
+ NfdLogTagUtil.TagBuilder tagBuilder = NfdLogTagUtil.TagBuilder.getTagBuilder();
+
+ for (Preference p : m_tagListPreferences) {
+ if (p instanceof ListPreference) {
+ ListPreference listPreference = (ListPreference) p;
+ tagBuilder.addTag(listPreference.getTitle(), listPreference.getValue());
+ }
+ }
+
+ NfdLogTagUtil.saveTags(getActivity(), tagBuilder.generateTagString());
+ }
+
+ /**
+ * @brief Convenience method to change all tags' log level to the
+ * given logLevel.
+ *
+ * @param logLevel Target log level to set to.
+ */
+ private void setAllTagPreferences(String logLevel) {
+ for (ListPreference preference : m_tagListPreferences) {
+ preference.setValue(logLevel);
+ m_tagPreferenceChangeListener.onPreferenceChange(preference, logLevel);
+ }
+ }
+
+ /** List of preferences for registering handlers */
+ private List<ListPreference> m_tagListPreferences;
+
+ /** Reset log level preference */
+ private Preference m_resetPreference;
+
+ /**
+ * @brief Change listener that updates the summary text of the tag preferences.
+ */
+ private Preference.OnPreferenceChangeListener m_tagPreferenceChangeListener
+ = new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ // Get value of preference setting as a String
+ String displayString = value.toString();
+
+ // Deal with ListPreference
+ if (preference instanceof ListPreference) {
+ // Get display value
+ ListPreference listPreference = (ListPreference) preference;
+ int offset = listPreference.findIndexOfValue(displayString);
+ displayString = (offset != -1) ?
+ (String) listPreference.getEntries()[offset] :
+ null;
+ }
+
+ // Update UI
+ preference.setSummary(displayString);
+ return true;
+ }
+ };
+
+ /**
+ * @bried Change listener that resets all preference tags' log levels.
+ */
+ private Preference.OnPreferenceChangeListener m_setAllPreferenceChangeListener
+ = new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ setAllTagPreferences(value.toString());
+ return true;
+ }
+ };
+ }
+}
diff --git a/app/src/main/java/net/named_data/nfd/NfdLogTagUtil.java b/app/src/main/java/net/named_data/nfd/NfdLogTagUtil.java
new file mode 100644
index 0000000..34d81ef
--- /dev/null
+++ b/app/src/main/java/net/named_data/nfd/NfdLogTagUtil.java
@@ -0,0 +1,179 @@
+/**
+ * Copyright (c) 2015 Regents of the University of California
+ *
+ * This file is part of NFD (Named Data Networking Forwarding Daemon) Android.
+ * See AUTHORS.md for complete list of NFD Android authors and contributors.
+ *
+ * NFD Android is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NFD Android, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.named_data.nfd;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @brief Utility class to generate and retrieve log tags
+ */
+public class NfdLogTagUtil {
+
+ /**
+ * @brief Get tags that are stored for the given application's context.
+ *
+ * The method returns a string representation of tags that should be displayed
+ * to the UI. These tags and their output levels have been saved by the settings
+ * UI in the given context.
+ *
+ * An example of the return string is as such:
+ *
+ * <pre>
+ * NFDService:S Strategy:S TcpChannel:S TcpFactory:S TcpLocalFace:S UdpFactory:S *:S
+ * </pre>
+ *
+ * @param context Current application context to retrieve log tags for
+ * @return String representation of log tags ready for use as arguments
+ * to logcat.
+ */
+ public static String getTags(Context context) {
+ SharedPreferences preferences = context.getSharedPreferences(
+ PREFERENCE_NFD_TAGS_FILENAME, Context.MODE_PRIVATE);
+ String tagsString = preferences.getString(PREFERENCE_NFD_TAGS_KEY, "");
+
+ G.Log("loadCommand(): " + tagsString);
+
+ return tagsString;
+ }
+
+ /**
+ * @brief Save tags as a string to the current context's preference.
+ *
+ * An example of a tag string that should be saved is shown as follows:
+ *
+ * <pre>
+ * NFDService:S Strategy:S TcpChannel:S TcpFactory:S TcpLocalFace:S UdpFactory:S *:S
+ * </pre>
+ *
+ * NdfLogTagUtil.TagBuilder provides convenient methods to generate tag strings.
+ *
+ * @param context Current application context to save tag string to
+ * @param tagsString String representation of the tags to be saved
+ */
+ public static void saveTags(Context context, String tagsString) {
+ // Save preferred log level
+ SharedPreferences.Editor editor
+ = context.getSharedPreferences(
+ PREFERENCE_NFD_TAGS_FILENAME, Context.MODE_PRIVATE).edit();
+ editor.putString(PREFERENCE_NFD_TAGS_KEY, tagsString);
+ editor.commit();
+
+ G.Log("saveTags(): " + tagsString);
+ }
+
+ /**
+ * @brief Convenience class to create and generate tags for use as arguments
+ * to logcat.
+ */
+ public static class TagBuilder {
+
+ private TagBuilder() {
+ m_tagMap = new HashMap<CharSequence, CharSequence>();
+ }
+
+ /**
+ * @brief Get a new instance of a TagBuilder object.
+ *
+ * @return New TagBuilder ojbect for use.
+ */
+ public static TagBuilder getTagBuilder() {
+ return new TagBuilder();
+ }
+
+ /**
+ * @bried Add a tag with an associated log level value.
+ *
+ * Tag can be any tag for the logger to filter.
+ *
+ * The log level should be one of the following form:
+ * <pre>
+ * Log Level | Meaning
+ * ===================
+ * V : Verbose
+ * D : Debug
+ * I : Info
+ * W : Warning
+ * E : Error
+ * F : Fatal
+ * S : Silent
+ * </pre>
+ *
+ * @param tag Tag for the logger to filter for.
+ * @param logLevel Log level for specified tag.
+ */
+ public void addTag(CharSequence tag, CharSequence logLevel) {
+ m_tagMap.put(tag, logLevel);
+ }
+
+ /**
+ * @brief Silence all tags that are not added to the current TagBuilder
+ * object.
+ */
+ public synchronized void addSilenceNonRelatedTags() {
+ m_silenceNonRelatedTags = true;
+ }
+
+ /**
+ * @brief Generate a string representing all the tags to be filtered and the
+ * relevant log levels.
+ *
+ * An example of a string returned by this method is:
+ *
+ * <pre>
+ * NFDService:S Strategy:S TcpChannel:S TcpFactory:S TcpLocalFace:S UdpFactory:S *:S
+ * </pre>
+ *
+ * @return String representation of the tags and their relevant log levels to be
+ * filtered.
+ */
+ public String generateTagString() {
+ ArrayList<String> tags = new ArrayList<String>();
+ for (Map.Entry<CharSequence, CharSequence> item : m_tagMap.entrySet()) {
+ tags.add(String.format("%s:%s", item.getKey(), item.getValue()));
+ }
+
+ Collections.sort(tags);
+
+ if (m_silenceNonRelatedTags) {
+ tags.add("*:S");
+ }
+
+ return TextUtils.join(" ", tags);
+ }
+
+ /** Mapping of tag and log levels */
+ private Map<CharSequence, CharSequence> m_tagMap;
+
+ /** Flag that determines if all non related tags should be silenced */
+ private boolean m_silenceNonRelatedTags;
+ }
+
+ /** @brief Preference filename */
+ private static final String PREFERENCE_NFD_TAGS_FILENAME = "NFD_TAGS_PREFERENCE_FILE";
+
+ /** @brief Key in SharedPreference that stores the string of tags */
+ private static final String PREFERENCE_NFD_TAGS_KEY = "NFD_TAGS";
+}
diff --git a/app/src/main/java/net/named_data/nfd/NfdMainActivity.java b/app/src/main/java/net/named_data/nfd/NfdMainActivity.java
index e9a5165..272b4b4 100644
--- a/app/src/main/java/net/named_data/nfd/NfdMainActivity.java
+++ b/app/src/main/java/net/named_data/nfd/NfdMainActivity.java
@@ -95,6 +95,10 @@
toggleNfdState();
}
+ public void launchLogActivity(View view) {
+ startActivity(new Intent(this, NfdLogActivity.class));
+ }
+
/**
* Thread safe way to start and stop the NFD through
* the UI Button.
diff --git a/app/src/main/java/net/named_data/nfd/NfdSettingsActivity.java b/app/src/main/java/net/named_data/nfd/NfdSettingsActivity.java
deleted file mode 100644
index 99cbfa0..0000000
--- a/app/src/main/java/net/named_data/nfd/NfdSettingsActivity.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
- * Copyright (c) 2015 Regents of the University of California
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon) Android.
- * See AUTHORS.md for complete list of NFD Android authors and contributors.
- *
- * NFD Android is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD Android, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package net.named_data.nfd;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager;
-import android.preference.RingtonePreference;
-import android.text.TextUtils;
-
-import java.util.List;
-
-/**
- * A {@link PreferenceActivity} that presents a set of application settings. On
- * handset devices, settings are presented as a single list. On tablets,
- * settings are split by category, with category headers shown to the left of
- * the list of settings.
- * <p/>
- * See <a href="http://developer.android.com/design/patterns/settings.html">
- * Android Design: Settings</a> for design guidelines and the <a
- * href="http://developer.android.com/guide/topics/ui/settings.html">Settings
- * API Guide</a> for more information on developing a Settings UI.
- */
-public class NfdSettingsActivity extends PreferenceActivity
-{
- /**
- * Determines whether to always show the simplified settings UI, where
- * settings are presented in a single list. When false, settings are shown
- * as a master/detail two-pane view on tablets. When true, a single pane is
- * shown on tablets.
- */
- private static final boolean ALWAYS_SIMPLE_PREFS = false;
-
-
- @Override
- protected void onPostCreate(Bundle savedInstanceState)
- {
- super.onPostCreate(savedInstanceState);
-
- setupSimplePreferencesScreen();
- }
-
- /**
- * Shows the simplified settings UI if the device configuration if the
- * device configuration dictates that a simplified, single-pane UI should be
- * shown.
- */
- private void setupSimplePreferencesScreen()
- {
- if (!isSimplePreferences(this)) {
- return;
- }
-
- // In the simplified UI, fragments are not used at all and we instead
- // use the older PreferenceActivity APIs.
-
- // Add 'general' preferences.
- addPreferencesFromResource(R.xml.pref_general);
-
- // Add 'notifications' preferences, and a corresponding header.
- PreferenceCategory fakeHeader = new PreferenceCategory(this);
- fakeHeader.setTitle(R.string.pref_header_notifications);
- getPreferenceScreen().addPreference(fakeHeader);
- addPreferencesFromResource(R.xml.pref_notification);
-
- // Add 'data and sync' preferences, and a corresponding header.
- fakeHeader = new PreferenceCategory(this);
- fakeHeader.setTitle(R.string.pref_header_data_sync);
- getPreferenceScreen().addPreference(fakeHeader);
- addPreferencesFromResource(R.xml.pref_data_sync);
-
- // Bind the summaries of EditText/List/Dialog/Ringtone preferences to
- // their values. When their values change, their summaries are updated
- // to reflect the new value, per the Android Design guidelines.
- bindPreferenceSummaryToValue(findPreference("example_text"));
- bindPreferenceSummaryToValue(findPreference("example_list"));
- bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
- bindPreferenceSummaryToValue(findPreference("sync_frequency"));
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean onIsMultiPane()
- {
- return isXLargeTablet(this) && !isSimplePreferences(this);
- }
-
- /**
- * Helper method to determine if the device has an extra-large screen. For
- * example, 10" tablets are extra-large.
- */
- private static boolean isXLargeTablet(Context context)
- {
- return (context.getResources().getConfiguration().screenLayout &
- Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
- }
-
- /**
- * Determines whether the simplified settings UI should be shown. This is
- * true if this is forced via {@link #ALWAYS_SIMPLE_PREFS}, or the device
- * doesn't have newer APIs like {@link PreferenceFragment}, or the device
- * doesn't have an extra-large screen. In these cases, a single-pane
- * "simplified" settings UI should be shown.
- */
- private static boolean isSimplePreferences(Context context)
- {
- return ALWAYS_SIMPLE_PREFS ||
- Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB ||
- !isXLargeTablet(context);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
- public void onBuildHeaders(List<Header> target)
- {
- if (!isSimplePreferences(this)) {
- loadHeadersFromResource(R.xml.pref_headers, target);
- }
- }
-
- /**
- * A preference value change listener that updates the preference's summary
- * to reflect its new value.
- */
- private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener()
- {
- @Override
- public boolean onPreferenceChange(Preference preference, Object value)
- {
- String stringValue = value.toString();
-
- if (preference instanceof ListPreference) {
- // For list preferences, look up the correct display value in
- // the preference's 'entries' list.
- ListPreference listPreference = (ListPreference) preference;
- int index = listPreference.findIndexOfValue(stringValue);
-
- // Set the summary to reflect the new value.
- preference.setSummary(
- index >= 0 ?
- listPreference.getEntries()[index] :
- null);
-
- } else if (preference instanceof RingtonePreference) {
- // For ringtone preferences, look up the correct display value
- // using RingtoneManager.
- if (TextUtils.isEmpty(stringValue)) {
- // Empty values correspond to 'silent' (no ringtone).
- preference.setSummary(R.string.pref_ringtone_silent);
-
- } else {
- Ringtone ringtone = RingtoneManager.getRingtone(
- preference.getContext(), Uri.parse(stringValue));
-
- if (ringtone == null) {
- // Clear the summary if there was a lookup error.
- preference.setSummary(null);
- } else {
- // Set the summary to reflect the new ringtone display
- // name.
- String name = ringtone.getTitle(preference.getContext());
- preference.setSummary(name);
- }
- }
-
- } else {
- // For all other preferences, set the summary to the value's
- // simple string representation.
- preference.setSummary(stringValue);
- }
- return true;
- }
- };
-
- /**
- * Binds a preference's summary to its value. More specifically, when the
- * preference's value is changed, its summary (line of text below the
- * preference title) is updated to reflect the value. The summary is also
- * immediately updated upon calling this method. The exact display format is
- * dependent on the type of preference.
- *
- * @see #sBindPreferenceSummaryToValueListener
- */
- private static void bindPreferenceSummaryToValue(Preference preference)
- {
- // Set the listener to watch for value changes.
- preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
-
- // Trigger the listener immediately with the preference's
- // current value.
- sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
- PreferenceManager
- .getDefaultSharedPreferences(preference.getContext())
- .getString(preference.getKey(), ""));
- }
-
- /**
- * This fragment shows general preferences only. It is used when the
- * activity is showing a two-pane settings UI.
- */
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
- public static class GeneralPreferenceFragment extends PreferenceFragment
- {
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.pref_general);
-
- // Bind the summaries of EditText/List/Dialog/Ringtone preferences
- // to their values. When their values change, their summaries are
- // updated to reflect the new value, per the Android Design
- // guidelines.
- bindPreferenceSummaryToValue(findPreference("example_text"));
- bindPreferenceSummaryToValue(findPreference("example_list"));
- }
- }
-
- /**
- * This fragment shows notification preferences only. It is used when the
- * activity is showing a two-pane settings UI.
- */
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
- public static class NotificationPreferenceFragment extends PreferenceFragment
- {
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.pref_notification);
-
- // Bind the summaries of EditText/List/Dialog/Ringtone preferences
- // to their values. When their values change, their summaries are
- // updated to reflect the new value, per the Android Design
- // guidelines.
- bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
- }
- }
-
- /**
- * This fragment shows data and sync preferences only. It is used when the
- * activity is showing a two-pane settings UI.
- */
- @TargetApi(Build.VERSION_CODES.HONEYCOMB)
- public static class DataSyncPreferenceFragment extends PreferenceFragment
- {
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.pref_data_sync);
-
- // Bind the summaries of EditText/List/Dialog/Ringtone preferences
- // to their values. When their values change, their summaries are
- // updated to reflect the new value, per the Android Design
- // guidelines.
- bindPreferenceSummaryToValue(findPreference("sync_frequency"));
- }
- }
-}
diff --git a/app/src/main/res/layout/activity_log.xml b/app/src/main/res/layout/activity_log.xml
new file mode 100644
index 0000000..93f58f0
--- /dev/null
+++ b/app/src/main/res/layout/activity_log.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ListView
+ android:id="@+id/log_output"
+ android:layout_weight="1"
+ android:layout_width="match_parent"
+ android:layout_height="0dp">
+ </ListView>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index cb17103..ee8e9b5 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
- android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
- android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ tools:context=".MainActivity">
<Button
android:id="@+id/nfd_button"
@@ -12,6 +15,14 @@
android:layout_height="wrap_content"
android:onClick="toggleNfdState"
android:enabled="false"
- android:text="Checking on NFD Service ..." />
+ android:text="@string/checking_on_nfd" />
+
+ <Button
+ android:id="@+id/launch_logger"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/nfd_button"
+ android:onClick="launchLogActivity"
+ android:text="@string/launch_logger" />
</RelativeLayout>
diff --git a/app/src/main/res/layout/log_item.xml b/app/src/main/res/layout/log_item.xml
new file mode 100644
index 0000000..6b0b6e1
--- /dev/null
+++ b/app/src/main/res/layout/log_item.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:id="@+id/log_line"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_log.xml b/app/src/main/res/menu/menu_log.xml
new file mode 100644
index 0000000..b749bbe
--- /dev/null
+++ b/app/src/main/res/menu/menu_log.xml
@@ -0,0 +1,12 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context=".NfdLogActivity">
+
+ <item
+ android:id="@+id/action_log_settings"
+ android:title="@string/log_settings"
+ android:orderInCategory="100"
+ app:showAsAction="never" />
+
+</menu>
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index b1cb908..e80d2f5 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -1,6 +1,11 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
- <item android:id="@+id/action_settings" android:title="@string/action_settings"
- android:orderInCategory="100" app:showAsAction="never" />
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context=".MainActivity">
+
+ <item android:id="@+id/action_settings"
+ android:title="@string/action_settings"
+ android:orderInCategory="100"
+ app:showAsAction="never" />
+
</menu>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 601b73f..4e48935 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -8,4 +8,18 @@
<string name="stopping_nfd">Stopping NFD ...</string>
<string name="starting_nfd">Starting NFD ...</string>
<string name="reconnect_to_nfd">Reconnecting to NFD Service</string>
+ <string name="loading_logger">Loading logger ...</string>
+ <string name="log_level_verbose">Verbose</string>
+ <string name="log_level_debug">Debug</string>
+ <string name="log_level_info">Info</string>
+ <string name="log_level_warn">Warn</string>
+ <string name="log_level_error">Error</string>
+ <string name="log_level_assert">Assert</string>
+ <string name="log_level_fatal">Fatal</string>
+ <string name="log_level_silent">Silent</string>
+ <string name="nfd_logger">NFD Logger</string>
+ <string name="log_settings">Log Settings</string>
+ <string name="nfd_log_settings">NFD Log Settings</string>
+ <string name="checking_on_nfd">Checking on NFD Service ...</string>
+ <string name="launch_logger">Launch Logger!</string>
</resources>
diff --git a/app/src/main/res/values/strings_activity_nfd_settings.xml b/app/src/main/res/values/strings_activity_nfd_settings.xml
index 2686b04..e55844b 100644
--- a/app/src/main/res/values/strings_activity_nfd_settings.xml
+++ b/app/src/main/res/values/strings_activity_nfd_settings.xml
@@ -1,60 +1,79 @@
<resources>
- <!-- Strings related to Settings -->
+ <!-- Strings related to NFD Log Settings -->
- <!-- Example General settings -->
- <string name="pref_header_general">General</string>
+ <!-- General -->
+ <string name="pref_category_title_general">General</string>
+ <string name="pref_category_title_general_key">General_Key</string>
- <string name="pref_title_social_recommendations">Enable social recommendations</string>
- <string name="pref_description_social_recommendations">Recommendations for people to contact
- based on your message history
- </string>
+ <!-- Set all tags log level -->
+ <string name="pref_tags_log_level_title_key">All_Log_Levels_Key</string>
+ <string name="pref_tags_log_level_title">All Log Levels</string>
+ <string name="pref_tags_log_level_key">Reset_All_Tags_Log_Level_Key</string>
+ <string name="pref_tags_log_level">Reset</string>
- <string name="pref_title_display_name">Display name</string>
- <string name="pref_default_display_name">John Smith</string>
+ <!-- Tags -->
+ <string name="pref_category_title_tags">NFD Tags & Log Levels</string>
+ <string name="pref_category_title_tags_key">NFD_Tags_Key</string>
- <string name="pref_title_add_friends_to_messages">Add friends to messages</string>
- <string-array name="pref_example_list_titles">
- <item>Always</item>
- <item>When possible</item>
- <item>Never</item>
- </string-array>
- <string-array name="pref_example_list_values">
- <item>1</item>
- <item>0</item>
- <item>-1</item>
+ <!-- Tag Display Names -->
+ <string name="pref_tag_commandvalidator">CommandValidator</string>
+ <string name="pref_tag_facemanager">FaceManager</string>
+ <string name="pref_tag_facetable">FaceTable</string>
+ <string name="pref_tag_fibmanager">FibManager</string>
+ <string name="pref_tag_generalconfigsection">GeneralConfigSection</string>
+ <string name="pref_tag_internalface">InternalFace</string>
+ <string name="pref_tag_managerbase">ManagerBase</string>
+ <string name="pref_tag_privilegehelper">PrivilegeHelper</string>
+ <string name="pref_tag_remoteregistrator">RemoteRegistrator</string>
+ <string name="pref_tag_ribmanager">RibManager</string>
+ <string name="pref_tag_strategy">Strategy</string>
+ <string name="pref_tag_strategychoice">StrategyChoice</string>
+ <string name="pref_tag_tablesconfigsection">TablesConfigSection</string>
+ <string name="pref_tag_tcpchannel">TcpChannel</string>
+ <string name="pref_tag_tcpfactory">TcpFactory</string>
+ <string name="pref_tag_tcplocalface">TcpLocalFace</string>
+ <string name="pref_tag_udpfactory">UdpFactory</string>
+
+ <!-- Tag Keys -->
+ <string name="pref_tag_commandvalidator_key">CommandValidator</string>
+ <string name="pref_tag_facemanager_key">FaceManager</string>
+ <string name="pref_tag_facetable_key">FaceTable</string>
+ <string name="pref_tag_fibmanager_key">FibManager</string>
+ <string name="pref_tag_generalconfigsection_key">GeneralConfigSection</string>
+ <string name="pref_tag_internalface_key">InternalFace</string>
+ <string name="pref_tag_managerbase_key">ManagerBase</string>
+ <string name="pref_tag_privilegehelper_key">PrivilegeHelper</string>
+ <string name="pref_tag_remoteregistrator_key">RemoteRegistrator</string>
+ <string name="pref_tag_ribmanager_key">RibManager</string>
+ <string name="pref_tag_strategy_key">Strategy</string>
+ <string name="pref_tag_strategychoice_key">StrategyChoice</string>
+ <string name="pref_tag_tablesconfigsection_key">TablesConfigSection</string>
+ <string name="pref_tag_tcpchannel_key">TcpChannel</string>
+ <string name="pref_tag_tcpfactory_key">TcpFactory</string>
+ <string name="pref_tag_tcplocalface_key">TcpLocalFace</string>
+ <string name="pref_tag_udpfactory_key">UdpFactory</string>
+
+ <!-- Log Levels -->
+ <string-array name="pref_log_levels">
+ <item>Verbose</item>
+ <item>Debug</item>
+ <item>Info</item>
+ <item>Warn</item>
+ <item>Error</item>
+ <item>Fatal</item>
+ <item>Silent</item>
</string-array>
- <!-- Example settings for Data & Sync -->
- <string name="pref_header_data_sync">Data & sync</string>
-
- <string name="pref_title_sync_frequency">Sync frequency</string>
- <string-array name="pref_sync_frequency_titles">
- <item>15 minutes</item>
- <item>30 minutes</item>
- <item>1 hour</item>
- <item>3 hours</item>
- <item>6 hours</item>
- <item>Never</item>
- </string-array>
- <string-array name="pref_sync_frequency_values">
- <item>15</item>
- <item>30</item>
- <item>60</item>
- <item>180</item>
- <item>360</item>
- <item>-1</item>
+ <!-- Log Level Command Tag-->
+ <string-array name="pref_log_level_values">
+ <item>V</item>
+ <item>D</item>
+ <item>I</item>
+ <item>W</item>
+ <item>E</item>
+ <item>F</item>
+ <item>S</item>
</string-array>
- <string name="pref_title_system_sync_settings">System sync settings</string>
-
- <!-- Example settings for Notifications -->
- <string name="pref_header_notifications">Notifications</string>
-
- <string name="pref_title_new_message_notifications">New message notifications</string>
-
- <string name="pref_title_ringtone">Ringtone</string>
- <string name="pref_ringtone_silent">Silent</string>
-
- <string name="pref_title_vibrate">Vibrate</string>
</resources>
diff --git a/app/src/main/res/xml/pref_data_sync.xml b/app/src/main/res/xml/pref_data_sync.xml
deleted file mode 100644
index ffda831..0000000
--- a/app/src/main/res/xml/pref_data_sync.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
- dismiss it. -->
- <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
- <ListPreference
- android:key="sync_frequency"
- android:title="@string/pref_title_sync_frequency"
- android:entries="@array/pref_sync_frequency_titles"
- android:entryValues="@array/pref_sync_frequency_values"
- android:defaultValue="180"
- android:negativeButtonText="@null"
- android:positiveButtonText="@null" />
-
- <!-- This preference simply launches an intent when selected. Use this UI sparingly, per
- design guidelines. -->
- <Preference android:title="@string/pref_title_system_sync_settings">
- <intent android:action="android.settings.SYNC_SETTINGS" />
- </Preference>
-
-</PreferenceScreen>
diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml
deleted file mode 100644
index c49cbed..0000000
--- a/app/src/main/res/xml/pref_general.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <CheckBoxPreference
- android:key="example_checkbox"
- android:title="@string/pref_title_social_recommendations"
- android:summary="@string/pref_description_social_recommendations"
- android:defaultValue="true" />
-
- <!-- NOTE: EditTextPreference accepts EditText attributes. -->
- <!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->
- <EditTextPreference
- android:key="example_text"
- android:title="@string/pref_title_display_name"
- android:defaultValue="@string/pref_default_display_name"
- android:selectAllOnFocus="true"
- android:inputType="textCapWords"
- android:capitalize="words"
- android:singleLine="true"
- android:maxLines="1" />
-
- <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
- dismiss it. -->
- <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
- <ListPreference
- android:key="example_list"
- android:title="@string/pref_title_add_friends_to_messages"
- android:defaultValue="-1"
- android:entries="@array/pref_example_list_titles"
- android:entryValues="@array/pref_example_list_values"
- android:negativeButtonText="@null"
- android:positiveButtonText="@null" />
-
-</PreferenceScreen>
diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml
deleted file mode 100644
index f2af3f2..0000000
--- a/app/src/main/res/xml/pref_headers.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- These settings headers are only used on tablets. -->
-
- <header
- android:fragment="nfd.named_data.net.nfd.NfdSettingsActivity$GeneralPreferenceFragment"
- android:title="@string/pref_header_general"/>
-
- <header
- android:fragment="nfd.named_data.net.nfd.NfdSettingsActivity$NotificationPreferenceFragment"
- android:title="@string/pref_header_notifications"/>
-
- <header
- android:fragment="nfd.named_data.net.nfd.NfdSettingsActivity$DataSyncPreferenceFragment"
- android:title="@string/pref_header_data_sync"/>
-
-</preference-headers>
diff --git a/app/src/main/res/xml/pref_nfd_log.xml b/app/src/main/res/xml/pref_nfd_log.xml
new file mode 100644
index 0000000..37a0432
--- /dev/null
+++ b/app/src/main/res/xml/pref_nfd_log.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <PreferenceCategory
+ android:key="@string/pref_tags_log_level_title_key"
+ android:title="@string/pref_tags_log_level_title">
+
+ <ListPreference
+ android:key="@string/pref_tags_log_level_key"
+ android:title="@string/pref_tags_log_level"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:key="@string/pref_category_title_tags_key"
+ android:title="@string/pref_category_title_tags">
+
+ <ListPreference
+ android:key="@string/pref_tag_commandvalidator_key"
+ android:title="@string/pref_tag_commandvalidator"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_facemanager_key"
+ android:title="@string/pref_tag_facemanager"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_facetable_key"
+ android:title="@string/pref_tag_facetable"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_fibmanager_key"
+ android:title="@string/pref_tag_fibmanager"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_generalconfigsection_key"
+ android:title="@string/pref_tag_generalconfigsection"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_internalface_key"
+ android:title="@string/pref_tag_internalface"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_managerbase_key"
+ android:title="@string/pref_tag_managerbase"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_privilegehelper_key"
+ android:title="@string/pref_tag_privilegehelper"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_remoteregistrator_key"
+ android:title="@string/pref_tag_remoteregistrator"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_ribmanager_key"
+ android:title="@string/pref_tag_ribmanager"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_strategy_key"
+ android:title="@string/pref_tag_strategy"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_strategychoice_key"
+ android:title="@string/pref_tag_strategychoice"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_tablesconfigsection_key"
+ android:title="@string/pref_tag_tablesconfigsection"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_tcpchannel_key"
+ android:title="@string/pref_tag_tcpchannel"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_tcpfactory_key"
+ android:title="@string/pref_tag_tcpfactory"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_tcplocalface_key"
+ android:title="@string/pref_tag_tcplocalface"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <ListPreference
+ android:key="@string/pref_tag_udpfactory_key"
+ android:title="@string/pref_tag_udpfactory"
+ android:entries="@array/pref_log_levels"
+ android:entryValues="@array/pref_log_level_values"
+ android:defaultValue="I"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ </PreferenceCategory>
+</PreferenceScreen>
diff --git a/app/src/main/res/xml/pref_notification.xml b/app/src/main/res/xml/pref_notification.xml
deleted file mode 100644
index b4b8cae..0000000
--- a/app/src/main/res/xml/pref_notification.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- A 'parent' preference, which enables/disables child preferences (below)
- when checked/unchecked. -->
- <CheckBoxPreference
- android:key="notifications_new_message"
- android:title="@string/pref_title_new_message_notifications"
- android:defaultValue="true" />
-
- <!-- Allows the user to choose a ringtone in the 'notification' category. -->
- <!-- NOTE: This preference will be enabled only when the checkbox above is checked. -->
- <!-- NOTE: RingtonePreference's summary should be set to its value by the activity code. -->
- <RingtonePreference
- android:dependency="notifications_new_message"
- android:key="notifications_new_message_ringtone"
- android:title="@string/pref_title_ringtone"
- android:ringtoneType="notification"
- android:defaultValue="content://settings/system/notification_sound" />
-
- <!-- NOTE: This preference will be enabled only when the checkbox above is checked. -->
- <CheckBoxPreference
- android:dependency="notifications_new_message"
- android:key="notifications_new_message_vibrate"
- android:title="@string/pref_title_vibrate"
- android:defaultValue="true" />
-
-</PreferenceScreen>