/* * 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 android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager.LayoutParams; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.u17od.upm.database.AccountInformation; import com.u17od.upm.database.PasswordDatabase; public class AddEditAccount extends Activity implements OnClickListener { private static final int GENERIC_ERROR_DIALOG = 1; public static final String MODE = "MODE"; public static final int EDIT_MODE = 1; public static final int ADD_MODE = 2; public static final String ACCOUNT_TO_EDIT = "ACCOUNT_TO_EDIT"; public static final int EDIT_ACCOUNT_RESULT_CODE_TRUE = 25; public static final int EDIT_ACCOUNT_REQUEST_CODE = 223; public static final int OPEN_DATABASE_REQUEST_CODE = 225; private String accountToEdit; private int mode; private Button saveButton; private EditText accountName; private EditText userid; private EditText password; private EditText url; private EditText notes; private String originalAccountName; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Utilities.VERSION.SDK_INT >= Utilities.VERSION_CODES.HONEYCOMB) { getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); } setContentView(R.layout.add_edit_account_details); saveButton = (Button) findViewById(R.id.save_button); saveButton.setOnClickListener(this); ((Button) findViewById(R.id.cancel_button)).setOnClickListener(this); accountName = (EditText) findViewById(R.id.account_name); userid = (EditText) findViewById(R.id.account_userid); password = (EditText) findViewById(R.id.account_password); url = (EditText) findViewById(R.id.account_url); notes = (EditText) findViewById(R.id.account_notes); // Were we called to Add/Edit an Account Bundle extras = getIntent().getExtras(); mode = extras.getInt(MODE); accountToEdit = extras.getString(ACCOUNT_TO_EDIT); } @Override public void onResume() { super.onResume(); if (getPasswordDatabase() == null) { // If we don't have a database (maybe UPM's process was terminated // since we were last here) we need to show the EnterMasterPassword // activity so the user can enter their master password and open // the password database. EnterMasterPassword.databaseFileToDecrypt = Utilities.getDatabaseFile(this); Intent enterMasterPasswordIntent = new Intent(this, EnterMasterPassword.class); startActivityForResult(enterMasterPasswordIntent, OPEN_DATABASE_REQUEST_CODE); } else { // Set the title based on weather we were called to Edit/Add if (mode == EDIT_MODE) { setTitle(getString(R.string.edit_account)); AccountInformation accountToEdit = getPasswordDatabase().getAccount(this.accountToEdit); // Populate the on-screen fields. If accountToEdit should happen // to be null (for some unknown reason) close the activity to // return to the FullAccountList. if (accountToEdit != null) { originalAccountName = accountToEdit.getAccountName(); // Populate the form with the account to edit accountName.setText(accountToEdit.getAccountName()); userid.setText(new String(accountToEdit.getUserId())); password.setText(new String(accountToEdit.getPassword())); url.setText(new String(accountToEdit.getUrl())); notes.setText(new String(accountToEdit.getNotes())); } else { Log.w("AddEditAccount", "accountToEdit was unexpectedly null"); this.finish(); } } else { // must be add setTitle(getString(R.string.add_account)); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { /* * If the database was successfully opened then make it available * on the Application */ if (requestCode == OPEN_DATABASE_REQUEST_CODE) { if (resultCode == RESULT_OK) { ((UPMApplication) getApplication()).setPasswordDatabase(EnterMasterPassword.decryptedPasswordDatabase); } } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.save_button: String accountNameStr = accountName.getText().toString(); // Ensure all the required data has been entered before saving the // account if (accountNameStr.trim().length() == 0) { Toast.makeText(this, R.string.account_name_required_error, Toast.LENGTH_SHORT).show(); } else { // If editing this account then ensure another account doesn't exist with this same name if (mode == EDIT_MODE) { AccountInformation accountToEdit = getPasswordDatabase().getAccount(this.accountToEdit); AccountInformation secondAccount = getPasswordDatabase().getAccount(accountNameStr); if (secondAccount != null && secondAccount != accountToEdit) { Toast.makeText(this, getString(R.string.account_already_exists_error), Toast.LENGTH_SHORT).show(); } else { saveAccount(accountNameStr); } } else { // must be adding account // Check if an account with this name already exists if (getPasswordDatabase().getAccount(accountNameStr) != null) { Toast.makeText(this, getString(R.string.account_already_exists_error), Toast.LENGTH_SHORT).show(); } else { saveAccount(accountNameStr); } } } break; case R.id.cancel_button: this.finish(); break; } } private void saveAccount(final String accountName) { String useridBytes = userid.getText().toString(); String passwordBytes = password.getText().toString(); String urlBytes = url.getText().toString(); String notesBytes = notes.getText().toString(); AccountInformation ai = new AccountInformation( accountName, useridBytes, passwordBytes, urlBytes, notesBytes); // If editing an account then delete the exiting one before adding it again if (mode == EDIT_MODE) { getPasswordDatabase().deleteAccount(this.accountToEdit); // Put the edited account back on the ViewAccountDetails // activity so that the view can be re-populated with the // edited details ViewAccountDetails.account = ai; } getPasswordDatabase().addAccount(ai); new SaveDatabaseAsyncTask(this, new Callback() { @Override public void execute() { // If the account name has changed or we're added a new account // then pass back a value instructing the FullAccountList to // refresh the list of accounts if (!accountName.equals(originalAccountName) || mode == ADD_MODE) { setResult(EDIT_ACCOUNT_RESULT_CODE_TRUE); } AddEditAccount.this.finish(); } }).execute(getPasswordDatabase()); } @Override protected Dialog onCreateDialog(int id) { Dialog dialog = null; switch(id) { case GENERIC_ERROR_DIALOG: AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(R.string.generic_error) .setNeutralButton(R.string.ok_label, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); dialog = builder.create(); break; } return dialog; } private PasswordDatabase getPasswordDatabase() { return ((UPMApplication) getApplication()).getPasswordDatabase(); } }