/* (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.content.Context; import android.preference.Preference; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.ListPreference; import android.os.Bundle; import android.app.AlertDialog; import android.content.DialogInterface; import android.util.Log; import java.util.ArrayList; import com.actionbarsherlock.app.SherlockPreferenceActivity; import com.robobunny.SeekBarPreference; import com.samsung.sprc.fileselector.*; public class Preferences extends SherlockPreferenceActivity implements OnPreferenceClickListener, OnPreferenceChangeListener { private InstanceData data = null; private AlertDialog warnStartForegroundDialog = null; private class InstanceData { boolean history_dialog_showing; boolean start_foreground_dialog_showing; boolean clearlog_dialog_showing; boolean clearlog_progress_dialog_showing; boolean selectToastApps_dialog_showing; ArrayList<AppsSelector.AppItem> selectToastApps_appData; boolean selectBlockedApps_dialog_showing; ArrayList<AppsSelector.AppItem> selectBlockedApps_appData; InstanceData() { history_dialog_showing = NetworkLog.history.dialog_showing; start_foreground_dialog_showing = (warnStartForegroundDialog == null) ? false : true; clearlog_dialog_showing = NetworkLog.clearLog.dialog != null && NetworkLog.clearLog.dialog.isShowing(); clearlog_progress_dialog_showing = NetworkLog.clearLog.progressDialog != null && NetworkLog.clearLog.progressDialog.isShowing(); if(NetworkLog.selectToastApps != null && NetworkLog.selectToastApps.dialog != null && NetworkLog.selectToastApps.dialog.isShowing()) { selectToastApps_dialog_showing = true; selectToastApps_appData = NetworkLog.selectToastApps.appData; } if(NetworkLog.selectBlockedApps != null && NetworkLog.selectBlockedApps.dialog != null && NetworkLog.selectBlockedApps.dialog.isShowing()) { selectBlockedApps_dialog_showing = true; selectBlockedApps_appData = NetworkLog.selectBlockedApps.appData; } } } @Override public void onDestroy() { MyLog.d("Destroying preferences activity"); if(warnStartForegroundDialog != null) { warnStartForegroundDialog.dismiss(); } if(NetworkLog.history.dialog_showing) { NetworkLog.history.dialog.dismiss(); NetworkLog.history.dialog = null; } if(NetworkLog.clearLog.dialog != null && NetworkLog.clearLog.dialog.isShowing()) { NetworkLog.clearLog.dialog.dismiss(); NetworkLog.clearLog.dialog = null; } if(NetworkLog.clearLog.progressDialog != null && NetworkLog.clearLog.progressDialog.isShowing()) { NetworkLog.clearLog.progressDialog.dismiss(); NetworkLog.clearLog.progressDialog = null; } if(NetworkLog.selectBlockedApps != null && NetworkLog.selectBlockedApps.dialog != null && NetworkLog.selectBlockedApps.dialog.isShowing()) { NetworkLog.selectBlockedApps.dialog.dismiss(); NetworkLog.selectBlockedApps = null; } if(NetworkLog.selectToastApps != null && NetworkLog.selectToastApps.dialog != null && NetworkLog.selectToastApps.dialog.isShowing()) { NetworkLog.selectToastApps.dialog.dismiss(); NetworkLog.selectToastApps = null; } super.onDestroy(); } @Override public Object onRetainNonConfigurationInstance() { MyLog.d("Saving preference run"); data = new InstanceData(); return data; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyLog.d("Creating preferences activity"); addPreferencesFromResource(R.xml.preferences); findPreference("logfile").setOnPreferenceClickListener(this); findPreference("filter_dialog").setOnPreferenceClickListener(this); findPreference("log_method").setOnPreferenceClickListener(this); findPreference("manage_apps_dialog").setOnPreferenceClickListener(this); findPreference("notifications_toast_apps_dialog").setOnPreferenceClickListener(this); findPreference("clear_log").setOnPreferenceClickListener(this); findPreference("presort_by").setOnPreferenceChangeListener(this); findPreference("sort_by").setOnPreferenceChangeListener(this); CheckBoxPreference foreground = (CheckBoxPreference) findPreference("start_foreground"); foreground.setOnPreferenceClickListener(this); foreground.setChecked(NetworkLog.settings.getStartForeground()); String entries[] = getResources().getStringArray(R.array.interval_entries); String values[] = getResources().getStringArray(R.array.interval_values); final Context context = this; OnPreferenceChangeListener changeListener = new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, final Object newValue) { if(preference.getKey().equals("history_size")) { NetworkLog.appFragment.clear(); NetworkLog.logFragment.clear(); new Thread(new Runnable() { public void run() { NetworkLog.history.loadEntriesFromFile(context, (String)newValue); } }).start(); return true; } if(preference.getKey().equals("interval_placeholder")) { NetworkLog.settings.setGraphInterval(Long.parseLong((String) newValue)); return true; } if(preference.getKey().equals("viewsize_placeholder")) { NetworkLog.settings.setGraphViewsize(Long.parseLong((String) newValue)); return true; } if(preference.getKey().equals("notifications_toast")) { Boolean toast_enabled = (Boolean) newValue; ListPreference pref = (ListPreference) findPreference("notifications_toast_position"); String value = pref.getValue(); SeekBarPreference sbpref = (SeekBarPreference) findPreference("notifications_toast_yoffset"); if(toast_enabled && (value.equals("1") || value.equals("2"))) { sbpref.setEnabled(true); } else { sbpref.setEnabled(false); } } if(preference.getKey().equals("notifications_toast_position")) { String value = (String) newValue; SeekBarPreference sbpref = (SeekBarPreference) findPreference("notifications_toast_yoffset"); if(value.equals("1") || value.equals("2")) { sbpref.setEnabled(true); } else { sbpref.setEnabled(false); } return true; } return true; } }; ListPreference pref = (ListPreference) findPreference("interval_placeholder"); pref.setEntries(entries); pref.setEntryValues(values); pref.setValue(String.valueOf(NetworkLog.settings.getGraphInterval())); pref.setOnPreferenceChangeListener(changeListener); pref = (ListPreference) findPreference("viewsize_placeholder"); pref.setEntries(entries); pref.setEntryValues(values); pref.setValue(String.valueOf(NetworkLog.settings.getGraphViewsize())); pref.setOnPreferenceChangeListener(changeListener); pref = (ListPreference) findPreference("history_size"); pref.setOnPreferenceChangeListener(changeListener); CheckBoxPreference cbpref = (CheckBoxPreference) findPreference("notifications_toast"); cbpref.setOnPreferenceChangeListener(changeListener); boolean toast_enabled = cbpref.isChecked(); pref = (ListPreference) findPreference("notifications_toast_position"); pref.setOnPreferenceChangeListener(changeListener); String value = pref.getValue(); SeekBarPreference sbpref = (SeekBarPreference) findPreference("notifications_toast_yoffset"); if(toast_enabled && (value.equals("1") || value.equals("2"))) { sbpref.setEnabled(true); } else { sbpref.setEnabled(false); } data = (InstanceData) getLastNonConfigurationInstance(); if(data != null) { MyLog.d("Restoring preferences run"); if(data.start_foreground_dialog_showing == true) { warnStartForegroundDialog = toggleWarnStartForeground(this, foreground); } if(data.history_dialog_showing) { NetworkLog.history.createProgressDialog(this); } if(data.clearlog_dialog_showing) { NetworkLog.clearLog.showClearLogDialog(this); } if(data.clearlog_progress_dialog_showing) { NetworkLog.clearLog.showProgressDialog(this); } if(data.selectBlockedApps_dialog_showing) { NetworkLog.selectBlockedApps = new SelectBlockedApps(); NetworkLog.selectBlockedApps.showDialog(this, data.selectBlockedApps_appData); } if(data.selectToastApps_dialog_showing) { NetworkLog.selectToastApps = new SelectToastApps(); NetworkLog.selectToastApps.showDialog(this, data.selectToastApps_appData); } MyLog.d("Restored preferences run"); } } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String value = (String) newValue; if(preference.getKey().equals("presort_by")) { if(NetworkLog.appFragment != null) { NetworkLog.appFragment.preSortBy = Sort.forValue(value); NetworkLog.appFragment.setPreSortMethod(); } return true; } if(preference.getKey().equals("sort_by")) { if(NetworkLog.appFragment != null) { NetworkLog.appFragment.sortBy = Sort.forValue(value); NetworkLog.appFragment.setSortMethod(); } if(NetworkLog.menu != null) { com.actionbarsherlock.view.MenuItem item = null; if(value.equals("UID")) { item = NetworkLog.menu.findItem(R.id.sort_by_uid); } else if(value.equals("NAME")) { item = NetworkLog.menu.findItem(R.id.sort_by_name); } else if(value.equals("THROUGHPUT")) { item = NetworkLog.menu.findItem(R.id.sort_by_throughput); } else if(value.equals("PACKETS")) { item = NetworkLog.menu.findItem(R.id.sort_by_packets); } else if(value.equals("BYTES")) { item = NetworkLog.menu.findItem(R.id.sort_by_bytes); } else if(value.equals("TIMESTAMP")) { item = NetworkLog.menu.findItem(R.id.sort_by_timestamp); } if(item != null) { item.setChecked(true); } } return true; } return true; } @Override public boolean onPreferenceClick(Preference preference) { MyLog.d("Preference [" + preference.getKey() + "] clicked"); if(preference.getKey().equals("log_method")) { if(Iptables.getTargets(this)) { if(Iptables.targets.get("LOG") == null) { Log.w("NetworkLog", "Logging method preference not applicable to this device"); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.log_method_not_applicable_title)) .setMessage(getString(R.string.log_method_not_applicable_text)) .setCancelable(true) .setNeutralButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); return true; } } } if(preference.getKey().equals("manage_apps_dialog")) { NetworkLog.selectBlockedApps = new SelectBlockedApps(); NetworkLog.selectBlockedApps.showDialog(this); return true; } if(preference.getKey().equals("notifications_toast_apps_dialog")) { NetworkLog.selectToastApps = new SelectToastApps(); NetworkLog.selectToastApps.showDialog(this); return true; } if(preference.getKey().equals("logfile")) { OnHandleFileListener saveListener = new OnHandleFileListener() { public void handleFile(final String filePath) { MyLog.d("Set logfile path to: " + filePath); NetworkLog.settings.setLogFile(filePath); } }; new FileSelector(this, FileOperation.SAVE, saveListener, "networklog.txt", new String[] { "*.*", "*.txt" }).show(); return true; } if(preference.getKey().equals("filter_dialog")) { new FilterDialog(this); return true; } if(preference.getKey().equals("start_foreground")) { warnStartForegroundDialog = toggleWarnStartForeground(this, (CheckBoxPreference) preference); return true; } if(preference.getKey().equals("clear_log")) { NetworkLog.clearLog.showClearLogDialog(this); return true; } return false; } public AlertDialog toggleWarnStartForeground(final Context context, final CheckBoxPreference preference) { if(NetworkLog.settings.getStartForeground() == false) { // don't warn when enabling preference.setChecked(true); NetworkLog.settings.setStartForeground(true); NetworkLog.toggleServiceForeground(true); return null; } else { preference.setChecked(true); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.warning)) .setMessage(getString(R.string.warning_disabling_notification)) .setCancelable(true) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { preference.setChecked(true); NetworkLog.settings.setStartForeground(true); NetworkLog.toggleServiceForeground(true); warnStartForegroundDialog = null; dialog.dismiss(); } }) .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { preference.setChecked(false); NetworkLog.settings.setStartForeground(false); NetworkLog.toggleServiceForeground(false); warnStartForegroundDialog = null; dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); return alert; } } public class ComingSoonDialog { public ComingSoonDialog(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getString(R.string.coming_soon_title)) .setMessage(getString(R.string.coming_soon_text)) .setCancelable(true) .setNeutralButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); } } }