/*
* 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.io.File;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class AppEntryActivity extends Activity {
private static final int NEW_DATABASE_DIALOG = 1;
private static final int REQ_CODE_ENTER_PASSWORD = 0;
private static final int REQ_CODE_CREATE_DB = 1;
private static final int REQ_CODE_DOWNLOAD_DB = 2;
private static final int REQ_CODE_OPEN_DB = 3;
private static final int REQ_CODE_GET_DB_FILE = 4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (databaseFileExists()) {
// If databaseFileToDecrypt is null then UPM is just starting so
// show the EnterMasterPassword activity
if (EnterMasterPassword.databaseFileToDecrypt == null) {
EnterMasterPassword.databaseFileToDecrypt = Utilities.getDatabaseFile(this);
}
// savedInstanceState will be null if the app is just starting so
// in this case we should display the EnterMasterPassword activity
if (savedInstanceState == null) {
Intent i = new Intent(AppEntryActivity.this, EnterMasterPassword.class);
startActivityForResult(i, REQ_CODE_ENTER_PASSWORD);
}
} else {
showDialog(NEW_DATABASE_DIALOG);
}
}
/**
* We can get here from either EnterMasterPassword, CreateNewDatabase or
* DownloadRemoteDatabase. If all went well in one of those activities
* there should be a PasswordDatabase on the Application.
* If there is proceed to FullAccountList.
* If there isn't show the "New Database" dialog.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
case REQ_CODE_ENTER_PASSWORD:
if (resultCode == RESULT_OK) {
((UPMApplication) getApplication()).setPasswordDatabase(EnterMasterPassword.decryptedPasswordDatabase);
Intent i = new Intent(AppEntryActivity.this, FullAccountList.class);
startActivityForResult(i, REQ_CODE_OPEN_DB);
} else {
// User clicked Back from the EnterMasterPassword activity so quit
finish();
}
break;
case REQ_CODE_CREATE_DB:
if (resultCode == RESULT_OK) {
Intent i = new Intent(AppEntryActivity.this, FullAccountList.class);
startActivityForResult(i, REQ_CODE_OPEN_DB);
}
break;
case REQ_CODE_DOWNLOAD_DB:
case REQ_CODE_GET_DB_FILE:
if (resultCode == RESULT_OK) {
Intent i = new Intent(AppEntryActivity.this, FullAccountList.class);
startActivityForResult(i, REQ_CODE_OPEN_DB);
}
break;
case REQ_CODE_OPEN_DB:
if (resultCode == FullAccountList.RESULT_ENTER_PW) {
EnterMasterPassword.databaseFileToDecrypt = Utilities.getDatabaseFile(this);
Intent i = new Intent(AppEntryActivity.this, EnterMasterPassword.class);
startActivityForResult(i, REQ_CODE_ENTER_PASSWORD);
} else if (resultCode == FullAccountList.RESULT_EXIT) {
// databaseFileToDecrypt is used in AppEntryActivity to indicate
// weather EnterMasterPassword needs to be shown.
EnterMasterPassword.databaseFileToDecrypt = null;
finish();
}
break;
}
}
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch(id) {
case NEW_DATABASE_DIALOG:
dialog = new Dialog(this);
dialog.setContentView(R.layout.new_database_options);
dialog.setTitle(R.string.new_database);
Button newDatabase = (Button) dialog.findViewById(R.id.new_database);
newDatabase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(AppEntryActivity.this, CreateNewDatabase.class);
startActivityForResult(i, REQ_CODE_CREATE_DB);
}
});
Button restoreDatabase = (Button) dialog.findViewById(R.id.restore_database);
restoreDatabase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
File restoreFile = new File(Environment.getExternalStorageDirectory(), Utilities.DEFAULT_DATABASE_FILE);
if (restoreFile.exists()) {
((UPMApplication) getApplication()).restoreDatabase(AppEntryActivity.this);
// Clear the activity stack and bring up AppEntryActivity
// This is effectively restarting the application
Intent i = new Intent(AppEntryActivity.this, AppEntryActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
} else {
String messageRes = getString(R.string.restore_file_doesnt_exist);
String message = String.format(messageRes, restoreFile.getAbsolutePath());
Toast.makeText(AppEntryActivity.this, message, Toast.LENGTH_LONG).show();
}
}
});
Button openRemoteDatabase = (Button) dialog.findViewById(R.id.open_remote_database);
openRemoteDatabase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(AppEntryActivity.this, DownloadRemoteDatabase.class);
startActivityForResult(i, REQ_CODE_DOWNLOAD_DB);
}
});
Button retrieveFromDropboxButton = (Button) dialog.findViewById(R.id.retrieve_from_dropbox);
retrieveFromDropboxButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(AppEntryActivity.this, SelectDatabaseFromDropboxActivity.class);
startActivityForResult(i, REQ_CODE_GET_DB_FILE);
}
});
// Close this Activity if the dialog is cancelled
dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
finish();
}
});
break;
}
return dialog;
}
private boolean databaseFileExists() {
return Utilities.getDatabaseFile(this).exists();
}
}