diff --git a/src/java/JavaFileStorageTest/.classpath b/src/java/JavaFileStorageTest/.classpath
new file mode 100644
index 00000000..51769745
--- /dev/null
+++ b/src/java/JavaFileStorageTest/.classpath
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/java/JavaFileStorageTest/.project b/src/java/JavaFileStorageTest/.project
new file mode 100644
index 00000000..d52c0101
--- /dev/null
+++ b/src/java/JavaFileStorageTest/.project
@@ -0,0 +1,33 @@
+
+
+ JavaFileStorageTest
+
+
+
+
+
+ com.android.ide.eclipse.adt.ResourceManagerBuilder
+
+
+
+
+ com.android.ide.eclipse.adt.PreCompilerBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ com.android.ide.eclipse.adt.ApkBuilder
+
+
+
+
+
+ com.android.ide.eclipse.adt.AndroidNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/src/java/JavaFileStorageTest/.settings/org.eclipse.jdt.core.prefs b/src/java/JavaFileStorageTest/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..b080d2dd
--- /dev/null
+++ b/src/java/JavaFileStorageTest/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/src/java/JavaFileStorageTest/AndroidManifest.xml b/src/java/JavaFileStorageTest/AndroidManifest.xml
new file mode 100644
index 00000000..4d8ae34a
--- /dev/null
+++ b/src/java/JavaFileStorageTest/AndroidManifest.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/java/JavaFileStorageTest/proguard-project.txt b/src/java/JavaFileStorageTest/proguard-project.txt
new file mode 100644
index 00000000..f2fe1559
--- /dev/null
+++ b/src/java/JavaFileStorageTest/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/src/java/JavaFileStorageTest/project.properties b/src/java/JavaFileStorageTest/project.properties
new file mode 100644
index 00000000..f8b165a6
--- /dev/null
+++ b/src/java/JavaFileStorageTest/project.properties
@@ -0,0 +1,17 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-17
+android.library.reference.1=../JavaFileStorage
+android.library.reference.2=../../../../LiveSDK-for-Android/src
+android.library.reference.3=../android-filechooser/code
diff --git a/src/java/JavaFileStorageTest/res/drawable-hdpi/ic_launcher.png b/src/java/JavaFileStorageTest/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 00000000..96a442e5
Binary files /dev/null and b/src/java/JavaFileStorageTest/res/drawable-hdpi/ic_launcher.png differ
diff --git a/src/java/JavaFileStorageTest/res/drawable-mdpi/ic_launcher.png b/src/java/JavaFileStorageTest/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 00000000..359047df
Binary files /dev/null and b/src/java/JavaFileStorageTest/res/drawable-mdpi/ic_launcher.png differ
diff --git a/src/java/JavaFileStorageTest/res/drawable-xhdpi/ic_launcher.png b/src/java/JavaFileStorageTest/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..71c6d760
Binary files /dev/null and b/src/java/JavaFileStorageTest/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/src/java/JavaFileStorageTest/res/layout/activity_file_storage_setup.xml b/src/java/JavaFileStorageTest/res/layout/activity_file_storage_setup.xml
new file mode 100644
index 00000000..b44ac370
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/layout/activity_file_storage_setup.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/src/java/JavaFileStorageTest/res/layout/activity_main.xml b/src/java/JavaFileStorageTest/res/layout/activity_main.xml
new file mode 100644
index 00000000..78118d6a
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/layout/activity_main.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/java/JavaFileStorageTest/res/layout/sftp_credentials.xml b/src/java/JavaFileStorageTest/res/layout/sftp_credentials.xml
new file mode 100644
index 00000000..b537cef0
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/layout/sftp_credentials.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/java/JavaFileStorageTest/res/menu/file_storage_setup.xml b/src/java/JavaFileStorageTest/res/menu/file_storage_setup.xml
new file mode 100644
index 00000000..c0020282
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/menu/file_storage_setup.xml
@@ -0,0 +1,9 @@
+
diff --git a/src/java/JavaFileStorageTest/res/menu/main.xml b/src/java/JavaFileStorageTest/res/menu/main.xml
new file mode 100644
index 00000000..c0020282
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/menu/main.xml
@@ -0,0 +1,9 @@
+
diff --git a/src/java/JavaFileStorageTest/res/values-sw600dp/dimens.xml b/src/java/JavaFileStorageTest/res/values-sw600dp/dimens.xml
new file mode 100644
index 00000000..44f01db7
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/values-sw600dp/dimens.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/src/java/JavaFileStorageTest/res/values-sw720dp-land/dimens.xml b/src/java/JavaFileStorageTest/res/values-sw720dp-land/dimens.xml
new file mode 100644
index 00000000..61e3fa8f
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/values-sw720dp-land/dimens.xml
@@ -0,0 +1,9 @@
+
+
+
+ 128dp
+
+
diff --git a/src/java/JavaFileStorageTest/res/values-v11/styles.xml b/src/java/JavaFileStorageTest/res/values-v11/styles.xml
new file mode 100644
index 00000000..3c02242a
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/src/java/JavaFileStorageTest/res/values-v14/styles.xml b/src/java/JavaFileStorageTest/res/values-v14/styles.xml
new file mode 100644
index 00000000..a91fd037
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/src/java/JavaFileStorageTest/res/values/dimens.xml b/src/java/JavaFileStorageTest/res/values/dimens.xml
new file mode 100644
index 00000000..55c1e590
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/values/dimens.xml
@@ -0,0 +1,7 @@
+
+
+
+ 16dp
+ 16dp
+
+
diff --git a/src/java/JavaFileStorageTest/res/values/strings.xml b/src/java/JavaFileStorageTest/res/values/strings.xml
new file mode 100644
index 00000000..a80a3596
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/values/strings.xml
@@ -0,0 +1,530 @@
+
+
+
+ JavaFileStorageTest
+ Settings
+ Hello world!
+ FileStorageSetupActivity
+ Feedback
+ Homepage
+ Keepass2Android is a password manager providing read/write access to KeePass 2.x databases on Android.
+ The User Interface is based on a port of KeepassDroid developed by Brian Pellin. Code for database operations is based on KeePass by Dominik Reichl. The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.
+ Accept
+ Add entry
+ Create entry for URL
+ Add group
+ Add Group
+ Edit Group
+ Algorithm
+ Algorithm
+ Keepass2Android
+ KP2A
+ Keepass2Android Offline
+ KP2A Offline
+ Application timeout
+ Time before locking database when the application is inactive.
+ Kill application process
+ Close-Button
+ Show a button in password screen to kill the application process (for paranoid users)
+ Application
+ Application settings
+
+ Security
+ Display
+ Password entry access
+ QuickUnlock
+ File handling
+ Brackets
+ Cancel
+ Clipboard cleared.
+ Clipboard timeout
+ Time before clearing clipboard after copying username or password
+ Select to copy username to clipboard
+ Select to copy password to clipboard
+ Entry is available through KP2A Keyboard
+ Could not open dialog to select input method. Please activate keyboard manually.
+ Please enable the Keepass2Android keyboard in your system settings.
+ Creating database key…
+ Current Group
+ Current Group: Root
+ Database
+ Digits
+ Keepass2Android comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.
+ \u2026
+ Enter database filename
+ Accessed
+ Cancel
+ Comments
+ Tags
+ Override URL
+ Confirm password
+ Created
+ Expires
+ Key file (optional)
+ Modified
+ Password
+ Save
+ Name
+ URL
+ User Name
+ Extra string fields
+ File attachments
+ Keepass2Android cannot handle this uri.
+ Error creating group.
+ Could not create parent directory.
+ This file already exists.
+ Failed to determine database settings.
+ Failed to launch link.
+ A filename is required.
+ Could not create file
+ Invalid database.
+ Invalid path.
+ A name is required.
+ A password or a keyfile is required.
+ At least one password generation type must be selected
+ Passwords do not match.
+ Rounds must be a number.
+ A title is required.
+ Enter a positive integer on length field
+ File not found.
+ File Browser
+ Generate Password
+ Group
+ comment
+ confirm password
+ generated password
+ Group name
+ key file
+ length
+ password
+ Password
+ name
+ url
+ override url
+ tag1, tag2
+ username
+ Invalid password or key file.
+ Invalid algorithm.
+ Database format not recognized.
+ Key file does not exist.
+ Key file is empty.
+ Length
+ Group list size
+ Text size in the group list
+ Loading database…
+ Lower-case
+ *****
+ Mask password
+ Hide passwords by default
+ About
+ Change Master Key
+ Copy Password
+ Copy User
+ Create
+ Settings
+ Database settings
+ Delete
+ Move to another group
+ Donate a beer...
+ Edit
+ Hide Password
+ Lock Database
+ Open
+ Rename
+ Search
+ Advanced Search
+ Go to URL
+ Change database…
+ Minus
+ Never
+ Yes
+ No
+ No entries in the database or group.
+ No search results
+ No handler for this url.
+ Open recent database (click to open)
+ Don\'t search backup and recycle bin entries
+ Omit \'Backup\' and Recycle Bin group from search results
+ KeePass database filename
+ Enter database password
+ Select master key type:
+ Creating new database…
+ Create database
+ Working…
+ Remembers the location of keyfiles
+ Save keyfile
+ Remove
+ Rijndael (AES)
+ Root
+ Encryption Rounds
+ Higher encryption rounds provide additional protection against brute force attacks, but can really slow down loading and saving.
+ rounds
+ Database name
+ Default user name for new entries
+ Saving database…
+ Space
+ Search
+ Show password
+ Sort by name
+ Sort by creation date
+ Special
+ Find what
+ Search results
+ Search in
+ Select another entry
+ Open the desired group, then press "%1$s"!
+ Insert here
+ Twofish
+ Underline
+ Unsupported database version.
+ Upper-case
+ Your sd card is currently read-only. You may not be able to save changes to your database.
+ Your sd card is not currently mounted on your device. You will not be able to load or create your database.
+ Version
+ Version history
+ Keepass2Android is developed by Philipp Crocoll.
+ Thanks to code contributions by %1$s.
+ The Twofish Cipher Plugin for Keepass was developed by Scott Greenberg and is included in KP2A.
+ android-filechooser was developed by Hai Bison
+ Please note
+ Contributors
+ Regular expression
+ Tan expires on use
+ Mark TAN entries expired when using them
+ Display username in list
+ Display usernames below entry titles. Useful for multiple accounts or TANs.
+ Remember databases
+ Remember recently opened databases and show them in the Open database screen.
+
+ Keepass2Android: Find password
+ Exclude expired entries
+ Options
+ Case sensitive
+ Open file...
+ Create new database...
+ Open URL...
+ Import file to new database...
+ The complete URL must be specified including protocol like http://.
+ File to import will be selected in the next step.
+ Enable QuickUnlock
+ Enter last %1$d characters of your password:
+ QuickUnlock!
+ Close database
+ Enable QuickUnlock by default
+ Defines whether QuickUnlock is enabled by default or not.
+ Hide QuickUnlock icon
+ QuickUnlock unfortunately does not work without displaying a notification icon. Select this option to use a transparent icon.
+ Length of QuickUnlock key
+ Maximum number of characters used as QuickUnlock password.
+ QuickUnlock failed: incorrect password!
+ File attachments directory
+ Directory where file attachments are saved to.
+ Save attachment
+ Please select where to save the attachment.
+ Save to SD card
+ Save to cache and open
+
+ Saved file to %1$s.
+ Could not save attachment to %1$s.
+ Invalid date/time format for expiry date!
+ A field name is required for each string.
+ Field Name
+ Field value
+ Protected field
+ Add file attachment...
+ Add additional string
+ Delete additional string
+ %1$s: Locked. QuickUnlock enabled.
+ %1$s: Unlocked.
+ Enter server credentials
+ File transactions
+ Use file transactions for writing databases
+ Lock when screen off
+ Lock the database when screen is switched off.
+ Database caching
+ Keep a copy of remote database files in the application cache directory. This allows to use remote databases even when offline.
+
+ SSL certificates
+ Define the behavior when certificate validation fails. Note: you can install certificates on your device if validation fails!
+
+
+ Clear cache?
+ This will delete all cached database files. Any changes you made while being offline which have not yet been synchronized will be lost! Continue?
+ Check for modifications
+ Check whether the file was modified externally before saving changes.
+
+ Clipboard notifications
+ Make username and password accessible through the notification bar and clipboard. Beware of password sniffers!
+ KP2A keyboard notification
+ Make full entry accessible through the KP2A keyboard (recommended).
+ Keyboard selection dialog
+ Open keyboard selection dialog when entry is available through KP2A keyboard after search.
+
+ Notification while unlocked
+ Show an ongoing notification while the database is unlocked.
+
+ Pre-load database file
+ Start background loading or downloading of the database file during password entry.
+
+ Do you want to overwrite the existing binary with the same name?
+ Overwrite existing binary?
+ Overwrite
+ Rename
+ Failed to add file attachment.
+ Recycle Bin
+ Do you want to delete this entry permanently? Press No to recycle.
+ Do you want to delete this group permanently? Press No to recycle.
+ Delete permanently?
+ Reload file?
+ The file which is currently open was changed by another program. Do you want to reload it?
+ Do you really want to discard the changes made? (The Save button is at the top of the form.)
+ Discard changes?
+ Suggest or vote for improvements
+ Rate this app
+ Translate KP2A
+ Adding entry…
+ Adding group…
+ Deleting entry…
+ Deleting group…
+ Setting password…
+ Undoing changes…
+ Transforming master key…
+ Decoding database…
+ Parsing database…
+ Checking target file for changes…
+ Merge changes?
+ The database file was modified externally. Do you want to load and merge the changes before saving? Select No if you want to overwrite the external changes.
+ Merging changes…
+ Yes, merge
+ No, overwrite
+
+ Synchronizing cached database…
+ Downloading remote file…
+ Uploading file…
+ Restoring remote file…
+ Files are in sync.
+ Database synchronized successfully!
+ Checking database for changes…
+
+ Could not save to remote: %1$s. Save again or use the Synchronize menu when remote connection is available again.
+ Could not open from remote: %1$s. Loaded file from local cache. You can still make changes in the database and synchronize them later.
+ Updated remote file.
+ Opened local file due to conflict with changes in remote file. Use Synchronize menu to merge.
+ Remote file and cache are synchronized.
+ Updated local cache copy of %1$s.
+ No changes detected.
+
+ Updated cached OTP auxiliary file: Remote counter was higher.
+ Updated remote OTP auxiliary file: Local counter was higher.
+
+ Synchronizing OTP auxiliary file…
+
+ database file
+ OTP auxiliary file
+
+ An error occured:
+
+ Synchronize database…
+
+ Cannot move group to this group.
+
+ Today, it\'s Oktoberfest! If you like Keepass2Android: wouldn\'t today be a good day to buy me a beer?
+ Tell me more!
+ No, I don\'t like it that much
+
+ host
+ port
+
+ Select the storage type:
+
+ Local file
+ Get from third-party app
+ Send to third-party app
+ FTP
+ HTTP (WebDav)
+ HTTPS (WebDav)
+ Dropbox
+ Dropbox (KP2A folder)
+ If you do not want to give KP2A access to your full Dropbox, you may select this option. It will request only access to the folder Apps/Keepass2Android. This is especially suited when creating a new database. If you already have a database, click this option to create the folder, then place your file inside the folder (from your PC) and then select this option again for opening the file.
+ Google Drive
+ SkyDrive
+ SFTP (SSH File Transfer)
+
+ File access initialization
+
+ Database location
+ You can store your database locally on your Android device or in the cloud (non-Offline version only). Keepass2Android makes the database available even if you are offline. As the database is securely encrypted with AES 256 bit encryption, nobody will be able to access your passwords except you. We recommend to select Dropbox: It\'s accessible on all your devices and even provides backups of previous file versions.
+ Select where you want to store the database:
+ Change location
+
+ Master password
+ Your database is encrypted with the password you enter here. Choose a strong password in order to keep the database safe! Tip: Make up a sentence or two and use the first letters of the words as password. Include punctuation marks.
+ Select a master password to protect your database:
+
+ Key file
+ A key file is basically a password stored in a file. Key files are typically stronger than master passwords, because the key can be a lot more complicated; however it\'s also harder to keep them secret. If you store your database in the cloud, don\'t store the key file there as well! This would make it completely useless! Important: Do not change the contents of the key file after creating the database!
+ Choose if you want to use a key file in addition to your master password:
+ Use key file
+
+ Error while adding the keyfile!
+
+ Load OTP auxiliary file…
+ Enter the next One-time-passwords (OTPs). Swipe your Yubikey NEO at the back of your device to enter via NFC.
+ OTP %1$d
+ Could not load auxiliary OTP file!
+ Please use the OtpKeyProv plugin in KeePass 2.x (PC) to configure your database for use with OTPs!
+ Please select database first. OTP is discarded for security reasons.
+ OTP discarded: All OTPs already entered!
+ Please close database first. OTP is discarded.
+ (One or more OTPs already available)
+ OTP secret (e.g. 01 23 ab cd…)
+ Error parsing OTP secret!
+ Failed to create OTP key! Make sure you have entered the correct OTPs.
+ Error updating OTP auxiliary file!
+ Saving auxiliary OTP file…
+
+ Loading…
+
+ Get more storage types
+
+ Warning: Server certificate validation failed: %1$s. Install appropriate root certificate on your device or see settings!
+ Error: Server certificate validation failed! Install appropriate root certificate on your device or see settings!
+
+ Change log
+
+
+ Version 0.9.2\n
+ * Added OTP support (compatible with OtpKeyProv plugin)\n
+ * Integrated NFC support for OTPs from YubiKey NEO \n
+ * Several UI improvements\n
+ * Integrated Keepass 2.24 library\n
+ * Added option to kill the app process (see settings)\n
+ * Improved SSL certificate validation\n
+ * Bug fixes\n
+
+
+
+ Version 0.9.1\n
+ * Integrated SkyDrive support (Keepass2Android regular edition only)\n
+ * Fixed problems with Google Drive integration\n
+ * Added NTLM support
+
+
+
+
+ Version 0.9\n
+ * Integrated Dropbox and Google Drive support (read/write databases; Keepass2Android regular edition only)\n
+ * Integrated custom file browser (based on android-filechooser by HBA)\n
+ * Improved user interface for creating new databases\n
+ * Included custom font DejaVu Sans Mono for displaying passwords\n
+ * Bug fixes
+
+
+
+
+ Version 0.8.6\n
+ * Support for Twofish cipher\n
+ * Allow editing of groups\n
+ * Allow moving of entries and groups\n
+ * QuickUnlock icon can be made transparent (see settings)\n
+ * Bug fixes
+
+
+
+ Version 0.8.5\n
+ * Remote files are stored in the local application cache to allow offline usage (including editing and later synchronization). See settings. \n
+ * Notification icon to visualize the lock-state of the database (see settings)\n
+ * Improved determination of lock-state in some situations\n
+ * Database files are loaded to memory while you are typing your password for increased loading speed (see settings)\n
+ * Entries can be added to root group\n
+ * Bug fixes (resolving reference fields, problems with keyboard on Italian an Chinese devices)
+
+
+ Version 0.8.4\n
+ * External database changes are detected and merged when saving\n
+ * Improved loading performance\n
+ * Improved search toolbar with suggestions\n
+ * New App logo!\n
+ * Added support for .kdbp format for faster loading/saving\n
+ * Improved editing of extra strings and hidden display when protected\n
+ Thanks to Alex Vallat for his code contributions!\n
+ Thanks to Niki Hüttner (www.close-cut.de) for the new logo!\n
+
+ Version 0.8.3\n
+* Username/TAN index displayed in entry list (see settings)\n
+* Entries can be created if search from browser doesn\'t return results\n
+* KP2A keyboard provides possibility to search for credentials for current app\n
+* App automatically closes after selecting an entry for use in keyboard\n
+* Keyboard selection dialog automatically opens after search for URL (see settings)\n
+* Placeholders in entry fields are replaced before copying (most placeholders supported)\n
+* minor bug fixes
+
+ Version 0.8.2\n
+* Support for Digest Authentication in WebDAV\n
+* Bugfixes (OI File manager, Open URL)
+
+ Version 0.8.1\n
+* KP2A Offline and "Online" can be installed both again\n
+* Added new translations (thanks to all contributors!)
+
+ Version 0.8\n
+* Improved user interface especially for Android 4.x devices\n
+* Allow using deliberate file managers for selecting existing files\n
+* Added safer way for opening attachments (through cache directory)\n
+* fixed bugs in Edit activity\n
+* probably introduced new bugs :-)
+
+ Extended possibility to donate a beer or something else
+Version 0.7\n
+* Increased loading speed: key transformations now 10x faster!\n
+* Added Keepass2Android soft-keyboard: Switch to this keyboard for entering credentials. Shields you from clipboard-based password sniffers (disable old clipboard notifications in the options)\n
+* Added option to donate a beer or something else (see menu)
+ Version 0.6.2\n
+* Google Drive/Dropbox/... integration: Use the official Google Drive or Dropbox App and open any .kdbx-file. This will now bring up KP2A.\n
+* Improved Search Dialog \n
+* Improved search results for Share URL with subdomains\n
+* Added options to give feedback, and rate and translate the app in the menu\n
+\n
+Version 0.6.1\n
+* Detect when database changes in the background (i.e. due to activity of a sync app)\n
+* Improved searching for URLs from the browser\n
+* Confirm dialog when discarding changes\n
+\n
+Version 0.6\n
+Initial public release
+
+
+ 30 seconds
+ 1 minute
+ 5 minutes
+ 10 minutes
+ 15 minutes
+ 30 minutes
+ 1 hour
+ Never
+
+
+ Small
+ Medium
+ Large
+
+
+ Do not remember username and password
+ Remember username only
+ Remember username and password
+
+
+ Password only
+ Password + Key file
+ Password + OTP
+ Password + OTP secret (recovery mode)
+
+
+ Ignore certificate validation failures
+ Warn when validation fails
+ Do not accept invalid certificates
+
+
+ Initial directory (optional):
+
+
diff --git a/src/java/JavaFileStorageTest/res/values/styles.xml b/src/java/JavaFileStorageTest/res/values/styles.xml
new file mode 100644
index 00000000..6ce89c7b
--- /dev/null
+++ b/src/java/JavaFileStorageTest/res/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/java/JavaFileStorageTest/src/com/example/javafilestoragetest/FileStorageSetupActivity.java b/src/java/JavaFileStorageTest/src/com/example/javafilestoragetest/FileStorageSetupActivity.java
new file mode 100644
index 00000000..eee98918
--- /dev/null
+++ b/src/java/JavaFileStorageTest/src/com/example/javafilestoragetest/FileStorageSetupActivity.java
@@ -0,0 +1,112 @@
+package com.example.javafilestoragetest;
+
+import keepass2android.javafilestorage.JavaFileStorage;
+import android.os.Bundle;
+import android.app.Activity;
+import android.content.Intent;
+import android.util.Log;
+import android.view.Menu;
+
+public class FileStorageSetupActivity
+extends Activity implements JavaFileStorage.FileStorageSetupActivity {
+
+ Bundle state = new Bundle();
+
+ boolean isRecreated = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_file_storage_setup);
+
+ if (savedInstanceState != null)
+ {
+ isRecreated = true;
+ state = (Bundle) savedInstanceState.clone();
+ Log.d("FSSA", "recreating state");
+ for (String key: state.keySet())
+ {
+ Log.d("FSSA", "state " + key + ":" +state.get(key));
+ }
+ }
+ if (!isRecreated)
+ {
+ if (MainActivity.storageToTest == null)
+ MainActivity.createStorageToTest(this, getApplicationContext());
+ MainActivity.storageToTest.onCreate(this, savedInstanceState);
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ outState.putAll(state);
+ Log.d("FSSA", "storing state");
+ for (String key: state.keySet())
+ {
+ Log.d("FSSA", "state " + key + ":" +state.get(key));
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (MainActivity.storageToTest == null)
+ {
+ Log.d("FSSA", "MainActivity.storageToTest==null!");
+ MainActivity.createStorageToTest(getApplicationContext(), getApplicationContext());
+ }
+ else
+ Log.d("FSSA", "MainActivity.storageToTest is safe!");
+ MainActivity.storageToTest.onResume(this);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ if (!isRecreated)
+ MainActivity.storageToTest.onStart(this);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // TODO Auto-generated method stub
+ super.onActivityResult(requestCode, resultCode, data);
+
+ MainActivity.storageToTest.onActivityResult(this, requestCode, resultCode, data);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.file_storage_setup, menu);
+ return true;
+ }
+
+ @Override
+ public String getPath() {
+ // TODO Auto-generated method stub
+ return getIntent().getStringExtra(JavaFileStorage.EXTRA_PATH);
+ }
+
+ @Override
+ public String getProcessName() {
+ return getIntent().getStringExtra(JavaFileStorage.EXTRA_PROCESS_NAME);
+ }
+
+ @Override
+ public boolean isForSave() {
+ return getIntent().getBooleanExtra(JavaFileStorage.EXTRA_IS_FOR_SAVE, false);
+ }
+ @Override
+ public Bundle getState() {
+ Log.d("FSSA", "returning state");
+ for (String key: state.keySet())
+ {
+ Log.d("FSSA", "state " + key + ":" +state.get(key));
+ }
+ return state;
+ }
+
+}
diff --git a/src/java/JavaFileStorageTest/src/com/example/javafilestoragetest/MainActivity.java b/src/java/JavaFileStorageTest/src/com/example/javafilestoragetest/MainActivity.java
new file mode 100644
index 00000000..4a3887b7
--- /dev/null
+++ b/src/java/JavaFileStorageTest/src/com/example/javafilestoragetest/MainActivity.java
@@ -0,0 +1,614 @@
+package com.example.javafilestoragetest;
+
+//
+//import java.io.IOException;
+//import java.util.ArrayList;
+//import java.util.List;
+//import android.accounts.AccountManager;
+//import android.app.Activity;
+//import android.content.Intent;
+//import android.os.Bundle;
+//import android.util.Log;
+//import android.widget.Toast;
+//
+//import com.google.api.client.extensions.android.http.AndroidHttp;
+//import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
+//import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException;
+//import com.google.api.client.http.ByteArrayContent;
+//import com.google.api.client.json.gson.GsonFactory;
+//import com.google.api.services.drive.Drive;
+//import com.google.api.services.drive.DriveScopes;
+//import com.google.api.services.drive.model.File;
+//import com.google.api.services.drive.model.FileList;
+//
+//public class MainActivity extends Activity {
+// static final int REQUEST_ACCOUNT_PICKER = 1;
+// static final int REQUEST_AUTHORIZATION = 2;
+// static final int CAPTURE_IMAGE = 3;
+//
+// private static Drive service;
+//
+//
+// @Override
+// public void onCreate(Bundle savedInstanceState) {
+// super.onCreate(savedInstanceState);
+//
+// List scopes = new ArrayList();
+// scopes.add(DriveScopes.DRIVE);
+// GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(this, scopes);
+// startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
+// }
+//
+// @Override
+// protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
+// switch (requestCode) {
+// case REQUEST_ACCOUNT_PICKER:
+// if (resultCode == RESULT_OK && data != null && data.getExtras() != null) {
+// String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
+// if (accountName != null) {
+// List scopes = new ArrayList();
+// scopes.add(DriveScopes.DRIVE);
+// GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(this, scopes);
+// credential.setSelectedAccountName(accountName);
+// service = getDriveService(credential);
+// saveFileToDrive();
+// }
+// }
+// break;
+// case REQUEST_AUTHORIZATION:
+// if (resultCode == Activity.RESULT_OK) {
+// saveFileToDrive();
+// } else {
+// List scopes = new ArrayList();
+// scopes.add(DriveScopes.DRIVE);
+// GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(this, scopes);
+// startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
+// }
+// break;
+// }
+// }
+// private void saveFileToDrive() {
+// Thread t = new Thread(new Runnable() {
+// @Override
+// public void run() {
+// try {
+// // File's binary content
+// ByteArrayContent mediaContent = new ByteArrayContent("text/plain","abcnrt".getBytes());
+//
+// // File's metadata.
+// File body = new File();
+// body.setTitle("sometext.txt");
+// body.setMimeType("text/plain");
+//
+// listFolders("root", 0);
+//
+///* FileList folders=service.files().list().setQ("mimeType='application/vnd.google-apps.folder' and trashed=false and hidden=false").execute();
+// for(File fl: folders.getItems()){
+// Log.v("JFS"+" fOLDER name:",fl.getTitle());
+// }
+// *//*
+//
+//
+// File file = service.files().insert(body, mediaContent).execute();
+// if (file != null) {
+// showToast("File uploaded: " + file.getTitle());
+//
+// }*/
+// } catch (UserRecoverableAuthIOException e) {
+// startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+// }
+//
+// private void listFolders(String id, int level) throws IOException {
+// FileList folders=service.files().list().setQ("mimeType='application/vnd.google-apps.folder' and trashed=false and hidden=false and '"+id+"' in parents").execute();
+// for(File fl: folders.getItems()){
+// String pre = "";
+// for (int i=0;i ";
+// Log.v("JFS fOLDER name:",pre+fl.getTitle());
+// listFolders(fl.getId(), level+1);
+// }
+//
+// }
+// });
+// t.start();
+// }
+//
+// private Drive getDriveService(GoogleAccountCredential credential) {
+// return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential)
+// .build();
+// }
+//
+// public void showToast(final String toast) {
+// runOnUiThread(new Runnable() {
+// @Override
+// public void run() {
+// Toast.makeText(getApplicationContext(), toast, Toast.LENGTH_SHORT).show();
+// }
+// });
+// }
+//}
+
+
+import group.pals.android.lib.ui.filechooser.FileChooserActivity;
+import group.pals.android.lib.ui.filechooser.providers.BaseFileProviderUtils;
+
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.dropbox.client2.DropboxAPI;
+
+import keepass2android.javafilestorage.DropboxAppFolderFileStorage;
+import keepass2android.javafilestorage.DropboxFileStorage;
+import keepass2android.javafilestorage.GoogleDriveFileStorage;
+import keepass2android.javafilestorage.JavaFileStorage;
+import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
+import keepass2android.javafilestorage.SftpStorage;
+import keepass2android.javafilestorage.SkyDriveFileStorage;
+import keepass2android.kp2afilechooser.StorageFileProvider;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Application;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.util.Log;
+import android.view.Menu;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.EditText;
+import android.widget.Toast;
+
+/**
+ * @author Philipp
+ *
+ */
+public class MainActivity extends Activity implements JavaFileStorage.FileStorageSetupInitiatorActivity {
+
+ //a little dirty hack: make the file storage available to the whole app
+ //this is implemented nicer in the real app...
+ public static JavaFileStorage storageToTest;
+
+ class PerformTestTask extends AsyncTask