diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index b48090c3a..74210fe33 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -35,6 +35,7 @@ import java.util.List; import protect.card_locker.async.TaskHandler; import protect.card_locker.importexport.DataFormat; import protect.card_locker.importexport.ImportExportResult; +import protect.card_locker.importexport.ImportExportResultType; public class ImportExportActivity extends CatimaAppCompatActivity { private static final String TAG = "Catima"; @@ -97,7 +98,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity { startExport(writer, uri, exportPassword.toCharArray(), true); } catch (IOException e) { Log.e(TAG, "Failed to export file: " + result.toString(), e); - onExportComplete(ImportExportResult.GenericFailure, uri); + onExportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, result.toString()), uri); } }); @@ -175,7 +176,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity { startImport(reader, uri, importDataFormat, password, true); } catch (IOException e) { Log.e(TAG, "Failed to import file: " + uri.toString(), e); - onImportComplete(ImportExportResult.GenericFailure, uri, importDataFormat); + onImportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, e.toString()), uri, importDataFormat); } } @@ -357,56 +358,51 @@ public class ImportExportActivity extends CatimaAppCompatActivity { builder.show(); } + private String buildResultDialogMessage(ImportExportResult result, boolean isImport) { + int messageId; + + if (result.resultType() == ImportExportResultType.Success) { + messageId = isImport ? R.string.importSuccessful : R.string.exportSuccessful; + } else { + messageId = isImport ? R.string.importFailed : R.string.exportFailed; + } + + StringBuilder messageBuilder = new StringBuilder(getResources().getString(messageId)); + if (result.developerDetails() != null) { + messageBuilder.append("\n\n"); + messageBuilder.append(getResources().getString(R.string.include_if_asking_support)); + messageBuilder.append("\n\n"); + messageBuilder.append(result.developerDetails()); + } + + return messageBuilder.toString(); + } + private void onImportComplete(ImportExportResult result, Uri path, DataFormat dataFormat) { - if (result == ImportExportResult.BadPassword) { + ImportExportResultType resultType = result.resultType(); + + if (resultType == ImportExportResultType.BadPassword) { retryWithPassword(dataFormat, path); return; } AlertDialog.Builder builder = new AlertDialog.Builder(this); - - int messageId; - - if (result == ImportExportResult.Success) { - builder.setTitle(R.string.importSuccessfulTitle); - messageId = R.string.importSuccessful; - } else { - builder.setTitle(R.string.importFailedTitle); - messageId = R.string.importFailed; - } - - final String message = getResources().getString(messageId); - - builder.setMessage(message); - builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); + builder.setTitle(resultType == ImportExportResultType.Success ? R.string.importSuccessfulTitle : R.string.importFailedTitle); + builder.setMessage(buildResultDialogMessage(result, true)); + builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss()); builder.create().show(); } private void onExportComplete(ImportExportResult result, final Uri path) { + ImportExportResultType resultType = result.resultType(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); - - int messageId; - - if (result == ImportExportResult.Success) { - builder.setTitle(R.string.exportSuccessfulTitle); - messageId = R.string.exportSuccessful; - } else { - builder.setTitle(R.string.exportFailedTitle); - messageId = R.string.exportFailed; - } - - final String message = getResources().getString(messageId); - - builder.setMessage(message); + builder.setTitle(resultType == ImportExportResultType.Success ? R.string.exportSuccessfulTitle : R.string.exportFailedTitle); + builder.setMessage(buildResultDialogMessage(result, false)); builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss()); - if (result == ImportExportResult.Success) { + if (resultType == ImportExportResultType.Success) { final CharSequence sendLabel = ImportExportActivity.this.getResources().getText(R.string.sendLabel); builder.setPositiveButton(sendLabel, (dialog, which) -> { diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java index 3f12e7f8d..8284edff7 100644 --- a/app/src/main/java/protect/card_locker/ImportExportTask.java +++ b/app/src/main/java/protect/card_locker/ImportExportTask.java @@ -16,6 +16,7 @@ import java.nio.charset.StandardCharsets; import protect.card_locker.async.CompatCallable; import protect.card_locker.importexport.DataFormat; import protect.card_locker.importexport.ImportExportResult; +import protect.card_locker.importexport.ImportExportResultType; import protect.card_locker.importexport.MultiFormatExporter; import protect.card_locker.importexport.MultiFormatImporter; @@ -63,19 +64,20 @@ public class ImportExportTask implements CompatCallable { private ImportExportResult performImport(Context context, InputStream stream, SQLiteDatabase database, char[] password) { ImportExportResult importResult = MultiFormatImporter.importData(context, database, stream, format, password); - Log.i(TAG, "Import result: " + importResult.name()); + Log.i(TAG, "Import result: " + importResult); return importResult; } private ImportExportResult performExport(Context context, OutputStream stream, SQLiteDatabase database, char[] password) { - ImportExportResult result = ImportExportResult.GenericFailure; + ImportExportResult result; try { OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8); result = MultiFormatExporter.exportData(context, database, stream, format, password); writer.close(); } catch (IOException e) { + result = new ImportExportResult(ImportExportResultType.GenericFailure, e.toString()); Log.e(TAG, "Unable to export file", e); } diff --git a/app/src/main/java/protect/card_locker/importexport/ImportExportResult.java b/app/src/main/java/protect/card_locker/importexport/ImportExportResult.java index 8419d3ebe..5e8c287d6 100644 --- a/app/src/main/java/protect/card_locker/importexport/ImportExportResult.java +++ b/app/src/main/java/protect/card_locker/importexport/ImportExportResult.java @@ -1,7 +1,23 @@ package protect.card_locker.importexport; -public enum ImportExportResult { - Success, - GenericFailure, - BadPassword; +public class ImportExportResult { + private ImportExportResultType resultType; + private String developerDetails; + + public ImportExportResult(ImportExportResultType resultType) { + this(resultType, null); + } + + public ImportExportResult(ImportExportResultType resultType, String developerDetails) { + this.resultType = resultType; + this.developerDetails = developerDetails; + } + + public ImportExportResultType resultType() { + return resultType; + } + + public String developerDetails() { + return developerDetails; + } } diff --git a/app/src/main/java/protect/card_locker/importexport/ImportExportResultType.java b/app/src/main/java/protect/card_locker/importexport/ImportExportResultType.java new file mode 100644 index 000000000..940488b1a --- /dev/null +++ b/app/src/main/java/protect/card_locker/importexport/ImportExportResultType.java @@ -0,0 +1,7 @@ +package protect.card_locker.importexport; + +public enum ImportExportResultType { + Success, + GenericFailure, + BadPassword; +} \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java index 595082516..1f6e95790 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatExporter.java @@ -32,20 +32,20 @@ public class MultiFormatExporter { break; } + String error; if (exporter != null) { try { exporter.exportData(context, database, output, password); - return ImportExportResult.Success; - } catch (IOException e) { - Log.e(TAG, "Failed to export data", e); - } catch (InterruptedException e) { + return new ImportExportResult(ImportExportResultType.Success); + } catch (Exception e) { Log.e(TAG, "Failed to export data", e); + error = e.toString(); } - - return ImportExportResult.GenericFailure; } else { - Log.e(TAG, "Unsupported data format exported: " + format.name()); - return ImportExportResult.GenericFailure; + error = "Unsupported data format exported: " + format.name(); + Log.e(TAG, error); } + + return new ImportExportResult(ImportExportResultType.GenericFailure, error); } } diff --git a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java index 5f77a272c..6bfeb3e2b 100644 --- a/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/MultiFormatImporter.java @@ -46,23 +46,26 @@ public class MultiFormatImporter { break; } + String error = null; if (importer != null) { database.beginTransaction(); try { importer.importData(context, database, input, password); database.setTransactionSuccessful(); - return ImportExportResult.Success; + return new ImportExportResult(ImportExportResultType.Success); } catch (ZipException e) { - return ImportExportResult.BadPassword; + return new ImportExportResult(ImportExportResultType.BadPassword); } catch (IOException | FormatException | InterruptedException | JSONException | ParseException | NullPointerException e) { Log.e(TAG, "Failed to import data", e); + error = e.toString(); } finally { database.endTransaction(); } } else { - Log.e(TAG, "Unsupported data format imported: " + format.name()); + error = "Unsupported data format imported: " + format.name(); + Log.e(TAG, error); } - return ImportExportResult.GenericFailure; + return new ImportExportResult(ImportExportResultType.GenericFailure, error); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf381222d..57aeee633 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -268,4 +268,5 @@ Options Starred Set scale + If you want to request support, include the following info: \ No newline at end of file diff --git a/app/src/test/java/protect/card_locker/ImportExportTest.java b/app/src/test/java/protect/card_locker/ImportExportTest.java index 00164213d..f5e3085f5 100644 --- a/app/src/test/java/protect/card_locker/ImportExportTest.java +++ b/app/src/test/java/protect/card_locker/ImportExportTest.java @@ -49,6 +49,7 @@ import androidx.core.content.res.ResourcesCompat; import protect.card_locker.async.TaskHandler; import protect.card_locker.importexport.DataFormat; import protect.card_locker.importexport.ImportExportResult; +import protect.card_locker.importexport.ImportExportResultType; import protect.card_locker.importexport.MultiFormatExporter; import protect.card_locker.importexport.MultiFormatImporter; @@ -324,7 +325,7 @@ public class ImportExportTest { // Export data to CSV format ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); outStream.close(); TestHelpers.getEmptyDb(activity); @@ -333,7 +334,7 @@ public class ImportExportTest { // Import the CSV data result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -354,7 +355,7 @@ public class ImportExportTest { // Export data to CSV format ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, password); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); outStream.close(); TestHelpers.getEmptyDb(activity); @@ -363,7 +364,7 @@ public class ImportExportTest { // Import the CSV data result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, password); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -386,7 +387,7 @@ public class ImportExportTest { // Export data to CSV format ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); outStream.close(); TestHelpers.getEmptyDb(activity); @@ -395,7 +396,7 @@ public class ImportExportTest { // Import the CSV data result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -457,7 +458,7 @@ public class ImportExportTest { // Export data to CSV format ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); outStream.close(); TestHelpers.getEmptyDb(activity); @@ -466,7 +467,7 @@ public class ImportExportTest { // Import the CSV data result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(NUM_GROUPS, DBHelper.getGroupCount(mDatabase)); @@ -500,14 +501,14 @@ public class ImportExportTest { // Export into CSV data ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); outStream.close(); ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray()); // Import the CSV data on top of the existing database result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -529,7 +530,7 @@ public class ImportExportTest { // Export data to CSV format ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), mDatabase, outData, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); TestHelpers.getEmptyDb(activity); @@ -543,7 +544,7 @@ public class ImportExportTest { // Attempt to import the data result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inData, format, null); - assertEquals(ImportExportResult.GenericFailure, result); + assertEquals(ImportExportResultType.GenericFailure, result.resultType()); assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -586,7 +587,7 @@ public class ImportExportTest { // Check that the listener was executed assertNotNull(listener.result); - assertEquals(ImportExportResult.Success, listener.result); + assertEquals(ImportExportResultType.Success, listener.result.resultType()); TestHelpers.getEmptyDb(activity); @@ -607,7 +608,7 @@ public class ImportExportTest { // Check that the listener was executed assertNotNull(listener.result); - assertEquals(ImportExportResult.Success, listener.result); + assertEquals(ImportExportResultType.Success, listener.result.resultType()); assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase)); @@ -633,7 +634,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -670,7 +671,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -707,7 +708,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.GenericFailure, result); + assertEquals(ImportExportResultType.GenericFailure, result.resultType()); assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); TestHelpers.getEmptyDb(activity); @@ -731,7 +732,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -768,7 +769,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -805,7 +806,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -842,7 +843,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); csvText = ""; @@ -861,7 +862,7 @@ public class ImportExportTest { // Import the CSV data result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(1, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -1020,7 +1021,7 @@ public class ImportExportTest { // Import the CSV data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Catima, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(7, DBHelper.getLoyaltyCardCount(mDatabase)); assertEquals(3, DBHelper.getGroupCount(mDatabase)); @@ -1162,7 +1163,7 @@ public class ImportExportTest { // Import the Fidme data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Fidme, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -1210,13 +1211,13 @@ public class ImportExportTest { // Import the Stocard data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Stocard, null); - assertEquals(ImportExportResult.BadPassword, result); + assertEquals(ImportExportResultType.BadPassword, result.resultType()); assertEquals(0, DBHelper.getLoyaltyCardCount(mDatabase)); inputStream = getClass().getResourceAsStream("stocard.zip"); result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.Stocard, "da811b40a4dac56f0cbb2d99b21bbb9a".toCharArray()); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(3, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1); @@ -1302,7 +1303,7 @@ public class ImportExportTest { // Import the Voucher Vault data ImportExportResult result = MultiFormatImporter.importData(activity.getApplicationContext(), mDatabase, inputStream, DataFormat.VoucherVault, null); - assertEquals(ImportExportResult.Success, result); + assertEquals(ImportExportResultType.Success, result.resultType()); assertEquals(2, DBHelper.getLoyaltyCardCount(mDatabase)); LoyaltyCard card = DBHelper.getLoyaltyCard(mDatabase, 1);