/* (C) 2012 Pragmatic Software
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/
*/
package com.googlecode.networklog;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.Context;
import android.util.Log;
import java.io.File;
public class Settings implements OnSharedPreferenceChangeListener {
private SharedPreferences prefs;
private Context context;
// Force use of context constructor
private Settings() {}
public Settings(Context context) {
PreferenceManager.setDefaultValues(context, R.xml.preferences, false);
prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.registerOnSharedPreferenceChangeListener(this);
MyLog.enabled = getLogcatDebug();
this.context = context;
}
public String getHistorySize() {
return prefs.getString("history_size", "14400000");
}
public String getClearLogTimerange() {
return prefs.getString("clearlog_timerange", "0");
}
public String getLogFile() {
String logfile = prefs.getString("logfile", null);
if(logfile == null) {
logfile = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "networklog.txt";
Log.d("NetworkLog", "Set default logfile path: " + logfile);
}
return logfile;
}
public boolean getInvertUploadDownload() {
return prefs.getBoolean("invert_upload_download", false);
}
public boolean getWatchRules() {
return prefs.getBoolean("watch_rules", false);
}
public int getWatchRulesTimeout() {
return Integer.parseInt(prefs.getString("watch_rules_timeout", "120000"));
}
public boolean getBehindFirewall() {
return prefs.getBoolean("behind_firewall", false);
}
public boolean getThroughputBps() {
return prefs.getBoolean("throughput_bps", true);
}
public boolean getRoundValues() {
return prefs.getBoolean("round_values", true);
}
public boolean getStartForeground() {
return prefs.getBoolean("start_foreground", true);
}
public boolean getStartServiceAtBoot() {
return prefs.getBoolean("startServiceAtBoot", false);
}
public boolean getStartServiceAtStart() {
return prefs.getBoolean("startServiceAtStart", false);
}
public boolean getStopServiceAtExit() {
return prefs.getBoolean("stopServiceAtExit", false);
}
public boolean getResolveHosts() {
return prefs.getBoolean("resolve_hosts", false);
}
public boolean getResolvePorts() {
return prefs.getBoolean("resolve_ports", true);
}
public boolean getResolveCopies() {
return !prefs.getBoolean("copy_original_addrs", false);
}
public boolean getConfirmExit() {
return prefs.getBoolean("confirm_exit", true);
}
public String getFilterTextInclude() {
return prefs.getString("filter_text_include", "");
}
public boolean getFilterUidInclude() {
return prefs.getBoolean("filter_by_uid_include", false);
}
public boolean getFilterNameInclude() {
return prefs.getBoolean("filter_by_name_include", false);
}
public boolean getFilterAddressInclude() {
return prefs.getBoolean("filter_by_address_include", false);
}
public boolean getFilterPortInclude() {
return prefs.getBoolean("filter_by_port_include", false);
}
public boolean getFilterInterfaceInclude() {
return prefs.getBoolean("filter_by_interface_include", false);
}
public boolean getFilterProtocolInclude() {
return prefs.getBoolean("filter_by_protocol_include", false);
}
public String getFilterTextExclude() {
return prefs.getString("filter_text_exclude", "");
}
public boolean getFilterUidExclude() {
return prefs.getBoolean("filter_by_uid_exclude", false);
}
public boolean getFilterNameExclude() {
return prefs.getBoolean("filter_by_name_exclude", false);
}
public boolean getFilterAddressExclude() {
return prefs.getBoolean("filter_by_address_exclude", false);
}
public boolean getFilterPortExclude() {
return prefs.getBoolean("filter_by_port_exclude", false);
}
public boolean getFilterInterfaceExclude() {
return prefs.getBoolean("filter_by_interface_exclude", false);
}
public boolean getFilterProtocolExclude() {
return prefs.getBoolean("filter_by_protocol_exclude", false);
}
public int getUpdateMaxLogEntries() {
return prefs.getInt("update_max_log_entries", 0);
}
public long getMaxLogEntries() {
int updateMaxLogEntries = getUpdateMaxLogEntries();
if(updateMaxLogEntries == 0) {
setUpdateMaxLogEntries(1);
if(getMaxLogEntries() > 75000) {
setMaxLogEntries(75000);
}
}
return Long.parseLong(prefs.getString("max_log_entries", "75000"));
}
public Sort getPreSortBy() {
return Sort.forValue(prefs.getString("presort_by", "NAME"));
}
public Sort getSortBy() {
return Sort.forValue(prefs.getString("sort_by", "BYTES"));
}
public boolean getLogcatDebug() {
return prefs.getBoolean("logcat_debug", false);
}
public boolean getStatusbarNotifications() {
return prefs.getBoolean("notifications_statusbar", false);
}
public boolean getToastNotifications() {
return prefs.getBoolean("notifications_toast", false);
}
public int getToastNotificationsDuration() {
return Integer.parseInt(prefs.getString("notifications_toast_duration", "3500"));
}
public int getToastNotificationsPosition() {
return Integer.parseInt(prefs.getString("notifications_toast_position", "-1"));
}
public int getToastNotificationsYOffset() {
return prefs.getInt("notifications_toast_yoffset", 0);
}
public int getToastNotificationsOpacity() {
return prefs.getInt("notifications_toast_opacity", 119);
}
public boolean getToastNotificationsShowAddress() {
return prefs.getBoolean("notifications_toast_show_address", true);
}
public long getGraphInterval() {
return prefs.getLong("interval", 300000);
}
public long getGraphViewsize() {
return prefs.getLong("viewsize", 1000 * 60 * 60 * 4);
}
public int getLogMethod() {
return Integer.parseInt(prefs.getString("log_method", "0"));
}
public void setResolveHosts(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("resolve_hosts", value);
editor.commit();
}
public void setResolvePorts(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("resolve_ports", value);
editor.commit();
}
public void setResolveCopies(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("copy_original_addrs", value);
editor.commit();
}
public void setConfirmExit(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("confirm_exit", value);
editor.commit();
}
public void setFilterTextInclude(String value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("filter_text_include", value);
editor.commit();
}
public void setFilterUidInclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_uid_include", value);
editor.commit();
}
public void setFilterNameInclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_name_include", value);
editor.commit();
}
public void setFilterAddressInclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_address_include", value);
editor.commit();
}
public void setFilterPortInclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_port_include", value);
editor.commit();
}
public void setFilterInterfaceInclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_interface_include", value);
editor.commit();
}
public void setFilterProtocolInclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_protocol_include", value);
editor.commit();
}
public void setFilterTextExclude(String value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("filter_text_exclude", value);
editor.commit();
}
public void setFilterUidExclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_uid_exclude", value);
editor.commit();
}
public void setFilterNameExclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_name_exclude", value);
editor.commit();
}
public void setFilterAddressExclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_address_exclude", value);
editor.commit();
}
public void setFilterPortExclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_port_exclude", value);
editor.commit();
}
public void setFilterInterfaceExclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_interface_exclude", value);
editor.commit();
}
public void setFilterProtocolExclude(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("filter_by_protocol_exclude", value);
editor.commit();
}
public void setUpdateMaxLogEntries(int value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("update_max_log_entries", value);
editor.commit();
}
public void setMaxLogEntries(long value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("max_log_entries", String.valueOf(value));
editor.commit();
}
public void setPreSortBy(Sort value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("presort_by", value.toString());
editor.commit();
}
public void setSortBy(Sort value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("sort_by", value.toString());
editor.commit();
}
public void setLogcatDebug(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("logcat_debug", value);
editor.commit();
}
public void setStatusbarNotifications(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("notifications_statusbar", value);
editor.commit();
}
public void setToastNotifications(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("notifications_toast", value);
editor.commit();
}
public void setToastNotificationsDuration(int value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("notifications_toast_duration", String.valueOf(value));
editor.commit();
}
public void setToastNotificationsPosition(int value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("notifications_toast_position", String.valueOf(value));
editor.commit();
}
public void setToastNotificationsYOffset(int value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("notifications_toast_yoffset", value);
editor.commit();
}
public void setToastNotificationsOpacity(int value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("notifications_toast_opacity", value);
editor.commit();
}
public void setToastNotificationsShowAddress(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("notifications_toast_show_address", value);
editor.commit();
}
public void setGraphInterval(long value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("interval", value);
editor.commit();
}
public void setGraphViewsize(long value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("viewsize", value);
editor.commit();
}
public void setInvertUploadDownload(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("invert_upload_download", value);
editor.commit();
}
public void setWatchRules(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("watch_rules", value);
editor.commit();
}
public void setWatchRulesTimeout(int value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("watch_rules_timeout", String.valueOf(value));
editor.commit();
}
public void setBehindFirewall(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("behind_firewall", value);
editor.commit();
}
public void setThroughputBps(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("throughput_bps", value);
editor.commit();
}
public void setRoundValues(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("round_values", value);
editor.commit();
}
public void setStartForeground(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("start_foreground", value);
editor.commit();
}
public void setStartServiceAtBoot(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("startServiceAtBoot", value);
editor.commit();
}
public void setStartServiceAtStart(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("startServiceAtStart", value);
editor.commit();
}
public void setStopServiceAtExit(boolean value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("stopServiceAtExit", value);
editor.commit();
}
public void setHistorySize(String value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("history_size", value);
editor.commit();
}
public void setClearLogTimerange(String value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("clearlog_timerange", value);
editor.commit();
}
public void setLogMethod(int value) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("log_method", String.valueOf(value));
editor.commit();
}
public void setLogFile(String value) {
String oldValue = prefs.getString("logfile", null);
if(oldValue != null && !oldValue.equals(value)) {
// update only if values have changed (mainly to ensure service
// doesn't restart for same values)
SharedPreferences.Editor editor = prefs.edit();
editor.putString("logfile", value);
editor.commit();
if(NetworkLogService.instance != null) {
// if service is running, restart service so that logfile is opened
// with new path
NetworkLog.instance.stopService();
NetworkLog.instance.startService();
}
}
}
public void showSampleToast() {
if(NetworkLog.context != null && NetworkLog.handler != null) {
String msg = String.format(NetworkLog.context.getResources().getString(R.string.sample_toast_message),
NetworkLogService.toastYOffset, NetworkLogService.toastOpacity);
NetworkLogService.showToast(NetworkLog.context, NetworkLog.handler, msg, true);
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
MyLog.d("Shared prefs changed: [" + key + "]");
if(key.equals("log_method")) {
int value = Integer.parseInt(prefs.getString(key, "0"));
MyLog.d("New " + key + " value [" + value + "]");
if(NetworkLogService.instance != null) {
NetworkLog.instance.stopService();
NetworkLog.instance.startService();
}
}
if(key.equals("logfile")) {
String value = prefs.getString(key, null);
MyLog.d("New " + key + " value [" + value + "]");
// update service
return;
}
if(key.equals("startServiceAtBoot")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
}
if(key.equals("startServiceAtStart")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.startServiceAtStart = value;
return;
}
if(key.equals("stopServiceAtExit")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.stopServiceAtExit = value;
return;
}
if(key.equals("resolve_hosts")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.resolveHosts = value;
NetworkLog.logFragment.refreshAdapter();
NetworkLog.appFragment.refreshAdapter();
return;
}
if(key.equals("resolve_ports")) {
boolean value = prefs.getBoolean(key, true);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.resolvePorts = value;
NetworkLog.logFragment.refreshAdapter();
NetworkLog.appFragment.refreshAdapter();
return;
}
if(key.equals("copy_original_addrs")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.resolveCopies = !value;
return;
}
if(key.equals("max_log_entries")) {
String value = prefs.getString(key, "75000");
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.logFragment.maxLogEntries = Long.parseLong(value);
NetworkLog.logFragment.pruneLogEntries();
return;
}
if(key.equals("logcat_debug")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
MyLog.enabled = value;
return;
}
if(key.equals("presort_by")) {
String value = prefs.getString(key, "BYTES");
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.appFragment.preSortBy = Sort.forValue(value);
NetworkLog.appFragment.setPreSortMethod();
NetworkLog.appFragment.preSortData();
NetworkLog.appFragment.sortData();
NetworkLog.appFragment.refreshAdapter();
return;
}
if(key.equals("sort_by")) {
String value = prefs.getString(key, "BYTES");
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.appFragment.sortBy = Sort.forValue(value);
NetworkLog.appFragment.setSortMethod();
NetworkLog.appFragment.preSortData();
NetworkLog.appFragment.sortData();
NetworkLog.appFragment.sortChildren();
NetworkLog.appFragment.refreshAdapter();
return;
}
if(key.equals("notifications_toast")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.toastEnabled = value;
return;
}
if(key.equals("notifications_toast_duration")) {
int value = Integer.parseInt(prefs.getString(key, "3500"));
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.toastDuration = value;
showSampleToast();
return;
}
if(key.equals("notifications_toast_position")) {
int value = Integer.parseInt(prefs.getString(key, "-1"));
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.toastPosition = value;
showSampleToast();
return;
}
if(key.equals("notifications_toast_yoffset")) {
int value = prefs.getInt(key, 0);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.toastYOffset = value;
showSampleToast();
return;
}
if(key.equals("notifications_toast_opacity")) {
int value = prefs.getInt(key, 119);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.toastOpacity = value;
showSampleToast();
return;
}
if(key.equals("notifications_toast_show_address")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.toastShowAddress = value;
return;
}
if(key.equals("round_values")) {
boolean value = prefs.getBoolean(key, true);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLog.appFragment.roundValues = value;
NetworkLog.appFragment.refreshAdapter();
return;
}
if(key.equals("invert_upload_download")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.invertUploadDownload = value;
return;
}
if(key.equals("watch_rules")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.watchRules = value;
if(NetworkLogService.instance != null) {
NetworkLogService.instance.startWatchingRules();
}
return;
}
if(key.equals("watch_rules_timeout")) {
int value = Integer.parseInt(prefs.getString(key, "120000"));
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.watchRulesTimeout = value;
if(NetworkLogService.rulesWatcher != null) {
NetworkLogService.rulesWatcher.interrupt();
}
return;
}
if(key.equals("behind_firewall")) {
boolean value = prefs.getBoolean(key, false);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.behindFirewall = value;
if(NetworkLogService.instance != null) {
Iptables.removeRules(context);
Iptables.addRules(context);
}
return;
}
if(key.equals("throughput_bps")) {
boolean value = prefs.getBoolean(key, true);
MyLog.d("New " + key + " value [" + value + "]");
NetworkLogService.throughputBps = value;
ThroughputTracker.updateThroughputBps();
return;
}
}
}