/* * Universal Password Manager * Copyright (c) 2010-2011 Adrian Smith * * This file is part of Universal Password Manager. * * Universal Password Manager 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 2 of the License, or * (at your option) any later version. * * Universal Password Manager 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 Universal Password Manager; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package com.u17od.upm; import java.util.ArrayList; import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.view.KeyEvent; import com.u17od.upm.database.PasswordDatabase; public class Prefs extends PreferenceActivity implements OnPreferenceChangeListener { // Name of the preferences file public static final String PREFS_NAME = "UPMPrefs"; // Configuration setting constants public static final String PREF_TRUSTED_HOSTNAME = "trustedHostname"; public static final String SYNC_METHOD = "sync.method"; public static interface SyncMethod { public static final String DISABLED = "disabled"; public static final String DROPBOX = "dropbox"; public static final String HTTP = "http"; } // Reference to the various preference objects private ListPreference syncMethodPreference; private PreferenceCategory httpServerSettingsCategory; private ListPreference sharedURLAuthPref; private EditTextPreference sharedURLPref; private EditTextPreference trustedHostnamePref; private PasswordDatabase db; private String originalSyncMethod; private boolean saveRequired; private String[] syncMethodValues = { SyncMethod.DISABLED, SyncMethod.DROPBOX, SyncMethod.HTTP }; private String[] syncMethodHuman; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); saveRequired = false; // Create the menu items addPreferencesFromResource(R.xml.settings); // Load the preferences SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); httpServerSettingsCategory = (PreferenceCategory) findPreference("http_server_settings"); // Get a handle to the preference items sharedURLAuthPref = (ListPreference) findPreference("shared_url_auth"); sharedURLPref = (EditTextPreference) findPreference("shared_url"); trustedHostnamePref = (EditTextPreference) findPreference("trusted_hostname"); sharedURLAuthPref.setOnPreferenceChangeListener(this); sharedURLPref.setOnPreferenceChangeListener(this); trustedHostnamePref.setOnPreferenceChangeListener(this); // Populate the preferences db = ((UPMApplication) getApplication()).getPasswordDatabase(); String sharedURL = db.getDbOptions().getRemoteLocation(); if (sharedURL.equals("")) { sharedURL = null; } sharedURLPref.setText(sharedURL); ArrayList<String> accountNamesAL = db.getAccountNames(); String[] accountNames = new String[accountNamesAL.size() + 1]; accountNames[0] = ""; System.arraycopy(accountNamesAL.toArray(), 0, accountNames, 1, accountNamesAL.size()); sharedURLAuthPref.setEntryValues(accountNames); sharedURLAuthPref.setEntries(accountNames); sharedURLAuthPref.setValue(db.getDbOptions().getAuthDBEntry()); // Some preferences are stored using Android's SharedPreferences String trustedHostname = settings.getString(PREF_TRUSTED_HOSTNAME, ""); trustedHostnamePref.setText(trustedHostname); Resources res = getResources(); syncMethodHuman= res.getStringArray(R.array.sync_methods_human); syncMethodPreference = (ListPreference) findPreference("sync_method"); syncMethodPreference.setEntryValues(syncMethodValues); // Figure out what the sync method really is originalSyncMethod = Utilities.getSyncMethod(settings, sharedURL); // Populate the syncMethodPreference with what we've determined from // the stored preferences syncMethodPreference.setValue(originalSyncMethod); // Initialize the on-screen text based on the sync method initialiseFields(originalSyncMethod); syncMethodPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { initialiseFields((String) newValue); if (!newValue.equals(originalSyncMethod) && (newValue.equals(SyncMethod.HTTP) || originalSyncMethod.equals(SyncMethod.HTTP))) { saveRequired = true; } return true; } }); } private void initialiseFields(String syncMethod) { // Set the SyncMethod summary to the value selected in the List for (int i=0; i<syncMethodValues.length; i++) { if (syncMethod.equals(syncMethodValues[i])) { syncMethodPreference.setSummary(syncMethodHuman[i]); break; } } // Only enable the HTTP Server Settings category if the user // selected HTTP as their method of syncing if (syncMethod.equals(SyncMethod.HTTP)) { httpServerSettingsCategory.setEnabled(true); } else { httpServerSettingsCategory.setEnabled(false); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (saveRequired) { if (syncMethodPreference.getValue().equals(SyncMethod.HTTP)) { db.getDbOptions().setRemoteLocation(sharedURLPref.getText()); db.getDbOptions().setAuthDBEntry(sharedURLAuthPref.getValue()); } else { db.getDbOptions().setRemoteLocation(null); db.getDbOptions().setAuthDBEntry(null); } new SaveDatabaseAsyncTask(this, new Callback() { @Override public void execute() { Prefs.this.finish(); } }).execute(db); return true; } } return super.onKeyDown(keyCode, event); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference == sharedURLAuthPref) { if (!sharedURLAuthPref.getValue().equals(newValue)) { saveRequired = true; } } else if (preference == sharedURLPref) { if (sharedURLPref.getText() == null && newValue != null || !sharedURLPref.getText().equals(newValue)) { saveRequired = true; } } return true; } @Override protected void onStop(){ super.onStop(); // We need an Editor object to make preference changes. // All objects are from android.context.Context SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putString(PREF_TRUSTED_HOSTNAME, trustedHostnamePref.getText()); editor.putString(SYNC_METHOD, syncMethodPreference.getValue()); // Commit the edits! editor.commit(); } }