package de.fun2code.android.piratebox; import java.io.File; import android.app.Activity; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.widget.Toast; import de.fun2code.android.piratebox.database.DatabaseHandler; import de.fun2code.android.piratebox.dialog.directory.DirectoryDialog; import de.fun2code.android.piratebox.dialog.directory.DirectorySelectListener; import de.fun2code.android.piratebox.handler.ConnectionCountHandler; import de.fun2code.android.piratebox.util.DialogUtil; import de.fun2code.android.piratebox.util.NetworkUtil; import de.fun2code.android.piratebox.util.ShellUtil; /** * Main preference Activity * * @author joschi * */ public class PreferencesActivity extends PreferenceActivity { private SharedPreferences preferences; private Activity activity; /** * Shared preference listener that is used to update the SSID on the fly */ private OnSharedPreferenceChangeListener prefChangeListener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // Update SSID by using iwconfig command if(key.equals(Constants.PREF_SSID_NAME) && PirateBoxService.isApRunning()) { ShellUtil shellUtil = new ShellUtil(); String[] commands = { "iwconfig " + NetworkUtil.WIFI_INTERFACE + " essid '" + sharedPreferences.getString(Constants.PREF_SSID_NAME, activity.getResources().getString(R.string.pref_ssid_name_default)) + "'" }; shellUtil.execRootShell(commands); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activity = this; preferences = PreferenceManager.getDefaultSharedPreferences(this); addPreferencesFromResource(R.xml.preferences); updateExternalServerPreference(); CheckBoxPreference extServerCheckBoxPref = (CheckBoxPreference) findPreference(Constants.PREF_USE_EXTERNAL_SERVER); extServerCheckBoxPref.setOnPreferenceClickListener( new OnPreferenceClickListener() { @Override public boolean onPreferenceClick( Preference preference) { updateExternalServerPreference(); return true; } }); } @Override public void onResume() { super.onResume(); preferences.registerOnSharedPreferenceChangeListener(prefChangeListener); /* * Handle the press of the restore dnsmawq backup preference button */ findPreference(Constants.PREF_DEV_RESTORE_DNSMASQ).setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { NetworkUtil netUtil = new NetworkUtil(activity.getApplicationContext()); boolean res = netUtil.unwrapDnsmasq(); int resIdMessage = res ? R.string.dialog_msg_dnsmasq_restore_ok : R.string.dialog_msg_dnsmasq_restore_error; Toast.makeText(activity.getApplicationContext(), resIdMessage, Toast.LENGTH_SHORT).show(); return true; } }); /* * Handle the press of the restore networking preference button */ findPreference(Constants.PREF_DEV_RESET_NETWORKING).setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { NetworkUtil netUtil = new NetworkUtil(activity.getApplicationContext()); netUtil.flushIpTable(Constants.NAT_TABLE_NAME); Toast.makeText(activity.getApplicationContext(), R.string.dialog_msg_network_reset, Toast.LENGTH_SHORT).show(); return true; } }); /* * Handle the press of the clear statistics preference button */ findPreference(Constants.PREF_CLEAR_STATISTICS).setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { OnClickListener posListener = new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DatabaseHandler dbHandler = new DatabaseHandler(activity); dbHandler.clearTables(); if(PirateBoxService.isRunning()) { ConnectionCountHandler.clearConnectionCount(); } Toast.makeText(activity.getApplicationContext(), R.string.dialog_msg_clear_statistics, Toast.LENGTH_SHORT).show(); } }; DialogUtil.showDialog(activity, R.string.dialog_title_confirm, R.string.dialog_qst_clear_statistics, android.R.string.yes, android.R.string.no, posListener, null); return true; } }); /* * Handle the press of the storage directory preference button * Storage directory is now selectable via directory chooser */ findPreference(Constants.PREF_STORAGE_DIR).setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { DirectorySelectListener dirListener = new DirectorySelectListener() { @Override public void onDirectorySelected(String directory) { if(directory != null) { Editor edit = preferences.edit(); edit.putString(Constants.PREF_STORAGE_DIR, directory); edit.commit(); /* * Check if directory is writable, if not * show warning message. */ if(!new File(directory).canWrite()) { Toast.makeText(activity, R.string.warning_dir_not_writable, Toast.LENGTH_LONG).show(); } } } }; DirectoryDialog dirDialog = new DirectoryDialog(activity, R.style.PirateBoxTheme, true); String dir = preferences.getString(Constants.PREF_STORAGE_DIR, activity.getString(R.string.pref_storage_dir_default)); dir = new File(dir).exists() && new File(dir).isDirectory() ? dir : "/"; dirDialog.setCurrentDirectory(dir); dirDialog.setTitle(R.string.dialog_title_choose_directory); dirDialog.setOnDirectorySelectListener(dirListener); /* * Don't only show writable directories show them all. * Otherwise /mnt directories will not be displayed. */ dirDialog.showOnlyWritableDirs(false); dirDialog.show(); return true; } }); } @Override public void onPause() { super.onPause(); preferences.unregisterOnSharedPreferenceChangeListener(prefChangeListener); } /** * Enables/disables the external server port preference depending on the * state of the external server preference. */ private void updateExternalServerPreference() { CheckBoxPreference extServerCheckBoxPref = (CheckBoxPreference) findPreference(Constants.PREF_USE_EXTERNAL_SERVER); findPreference(Constants.PREF_EXTERNAL_SERVER_PORT).setEnabled(extServerCheckBoxPref.isChecked()); } }