diff --git a/src/java/JavaFileStorageTest-AS/.gitignore b/src/java/JavaFileStorageTest-AS/.gitignore
new file mode 100644
index 00000000..c6cbe562
--- /dev/null
+++ b/src/java/JavaFileStorageTest-AS/.gitignore
@@ -0,0 +1,8 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
diff --git a/src/java/JavaFileStorageTest-AS/app/.gitignore b/src/java/JavaFileStorageTest-AS/app/.gitignore
new file mode 100644
index 00000000..796b96d1
--- /dev/null
+++ b/src/java/JavaFileStorageTest-AS/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/src/java/JavaFileStorageTest-AS/app/build.gradle b/src/java/JavaFileStorageTest-AS/app/build.gradle
new file mode 100644
index 00000000..8ff160d0
--- /dev/null
+++ b/src/java/JavaFileStorageTest-AS/app/build.gradle
@@ -0,0 +1,32 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion '23.0.2'
+
+ defaultConfig {
+ applicationId "com.crocoapps.javafilestoragetest"
+ minSdkVersion 21
+ targetSdkVersion 23
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ testCompile 'junit:junit:4.12'
+ compile 'com.android.support:appcompat-v7:23.4.0'
+ compile project(':JavaFileStorage')
+ compile project(':android-filechooser')
+}
+
+configurations {
+ compile.exclude group: "org.apache.httpcomponents", module: "httpclient"
+}
diff --git a/src/java/JavaFileStorageTest-AS/app/proguard-rules.pro b/src/java/JavaFileStorageTest-AS/app/proguard-rules.pro
new file mode 100644
index 00000000..c2c00ad7
--- /dev/null
+++ b/src/java/JavaFileStorageTest-AS/app/proguard-rules.pro
@@ -0,0 +1,20 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in C:\Users\Philipp\AppData\Local\Xamarin\Universal\AndroidSDK/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# 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 *;
+#}
+
+-dontwarn
+-ignorewarnings
\ No newline at end of file
diff --git a/src/java/JavaFileStorageTest-AS/app/src/androidTest/java/com/crocoapps/javafilestoragetest/ApplicationTest.java b/src/java/JavaFileStorageTest-AS/app/src/androidTest/java/com/crocoapps/javafilestoragetest/ApplicationTest.java
new file mode 100644
index 00000000..74557827
--- /dev/null
+++ b/src/java/JavaFileStorageTest-AS/app/src/androidTest/java/com/crocoapps/javafilestoragetest/ApplicationTest.java
@@ -0,0 +1,13 @@
+package com.crocoapps.javafilestoragetest;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * Testing Fundamentals
+ */
+public class ApplicationTest extends ApplicationTestCase {
+ public ApplicationTest() {
+ super(Application.class);
+ }
+}
\ No newline at end of file
diff --git a/src/java/JavaFileStorageTest-AS/app/src/main/AndroidManifest.xml b/src/java/JavaFileStorageTest-AS/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..e7740ee6
--- /dev/null
+++ b/src/java/JavaFileStorageTest-AS/app/src/main/AndroidManifest.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/FileStorageSetupActivity.java b/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/FileStorageSetupActivity.java
new file mode 100644
index 00000000..9c8ef64c
--- /dev/null
+++ b/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/FileStorageSetupActivity.java
@@ -0,0 +1,114 @@
+package com.crocoapps.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);
+ Log.d("FSSA", "onCreate");
+
+ 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(), false);
+ 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(), false);
+ }
+ 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-AS/app/src/main/java/com/crocoapps/javafilestoragetest/MainActivity.java b/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/MainActivity.java
new file mode 100644
index 00000000..7bd75601
--- /dev/null
+++ b/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/MainActivity.java
@@ -0,0 +1,745 @@
+package com.crocoapps.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 keepass2android.javafilestorage.DropboxCloudRailStorage;
+import keepass2android.javafilestorage.DropboxV2Storage;
+import keepass2android.javafilestorage.ICertificateErrorHandler;
+import keepass2android.javafilestorage.JavaFileStorage;
+import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
+import keepass2android.javafilestorage.OneDriveStorage;
+import keepass2android.javafilestorage.SftpStorage;
+import keepass2android.javafilestorage.UserInteractionRequiredException;
+import keepass2android.javafilestorage.WebDavStorage;
+import keepass2android.kp2afilechooser.StorageFileProvider;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.app.Activity;
+import android.app.AlertDialog;
+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