From 2390568bdf0976d314f0859baf1c6201d00d9b1c Mon Sep 17 00:00:00 2001 From: Ankit Tiwari Date: Fri, 15 Oct 2021 22:51:52 +0530 Subject: [PATCH] Added Encrypted Backup feature.The Zip File is Password Protected, which is asked from the user at the time of export immediately on click of Export Button. --- .../card_locker/ImportExportActivity.java | 23 +++++++++++++++---- .../protect/card_locker/ImportExportTask.java | 9 ++++---- .../protect/card_locker/ImportExportTest.java | 3 ++- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index eb44bba87..20f305ffe 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -47,6 +47,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity private String importAlertTitle; private String importAlertMessage; private DataFormat importDataFormat; + private String exportPassword; @Override protected void onCreate(Bundle savedInstanceState) @@ -88,7 +89,19 @@ public class ImportExportActivity extends CatimaAppCompatActivity @Override public void onClick(View v) { - chooseFileWithIntent(intentCreateDocumentAction, CHOOSE_EXPORT_LOCATION); + AlertDialog.Builder builder = new AlertDialog.Builder(ImportExportActivity.this); + builder.setTitle(R.string.passwordRequired); + + final EditText input = new EditText(ImportExportActivity.this); + input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + builder.setView(input); + builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> { + chooseFileWithIntent(intentCreateDocumentAction, CHOOSE_EXPORT_LOCATION); + exportPassword = input.getText().toString(); + }); + builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel()); + builder.show(); + } }); @@ -211,7 +224,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity importExporter.execute(); } - private void startExport(final OutputStream target, final Uri targetUri, final boolean closeWhenDone) + private void startExport(final OutputStream target, final Uri targetUri,char[] password, final boolean closeWhenDone) { ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() { @@ -229,7 +242,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity }; importExporter = new ImportExportTask(ImportExportActivity.this, - DataFormat.Catima, target, listener); + DataFormat.Catima, target,password, listener); importExporter.execute(); } @@ -407,6 +420,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity { if (requestCode == CHOOSE_EXPORT_LOCATION) { + OutputStream writer; if (uri.getScheme() != null) { @@ -416,9 +430,8 @@ public class ImportExportActivity extends CatimaAppCompatActivity { writer = new FileOutputStream(new File(uri.toString())); } - Log.e(TAG, "Starting file export with: " + uri.toString()); - startExport(writer, uri, true); + startExport(writer, uri,exportPassword.toCharArray(),true); } else { diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java index 00b78b4d5..df2d26e0d 100644 --- a/app/src/main/java/protect/card_locker/ImportExportTask.java +++ b/app/src/main/java/protect/card_locker/ImportExportTask.java @@ -35,7 +35,7 @@ class ImportExportTask extends AsyncTask /** * Constructor which will setup a task for exporting to the given file */ - ImportExportTask(Activity activity, DataFormat format, OutputStream output, + ImportExportTask(Activity activity, DataFormat format, OutputStream output,char[] password, TaskCompleteListener listener) { super(); @@ -43,6 +43,7 @@ class ImportExportTask extends AsyncTask this.doImport = false; this.format = format; this.outputStream = output; + this.password = password; this.listener = listener; } @@ -70,14 +71,14 @@ class ImportExportTask extends AsyncTask return importResult; } - private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db) + private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db,char[] password) { ImportExportResult result = ImportExportResult.GenericFailure; try { OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8); - result = MultiFormatExporter.exportData(context, db, stream, format,null); + result = MultiFormatExporter.exportData(context, db, stream, format,password); writer.close(); } catch (IOException e) @@ -118,7 +119,7 @@ class ImportExportTask extends AsyncTask } else { - result = performExport(activity.getApplicationContext(), outputStream, db); + result = performExport(activity.getApplicationContext(), outputStream, db,password); } return result; diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index f0ed57a1e..9ac8bdd58 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -590,8 +590,9 @@ public class ImportExportTest TestTaskCompleteListener listener = new TestTaskCompleteListener(); // Export to the file + final String password = "123456789"; FileOutputStream fileOutputStream = new FileOutputStream(exportFile); - ImportExportTask task = new ImportExportTask(activity, DataFormat.Catima, fileOutputStream, listener); + ImportExportTask task = new ImportExportTask(activity, DataFormat.Catima, fileOutputStream,password.toCharArray(), listener); task.execute(); // Actually run the task to completion