diff --git a/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/helpers/Utils.java b/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/helpers/Utils.java
index 723afa11..08ced903 100644
--- a/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/helpers/Utils.java
+++ b/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/helpers/Utils.java
@@ -13,6 +13,8 @@
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.journeyapps.barcodescanner.BarcodeResult;
+import com.secuso.privacyfriendlycodescanner.qrscanner.database.HistoryItem;
import java.util.EnumMap;
import java.util.Map;
@@ -90,4 +92,37 @@ public static Bitmap generateCode(String data, BarcodeFormat original_format, in
return null;
}
}
+
+ public static HistoryItem createHistoryItem(Bitmap mCodeImage, BarcodeResult currentBarcodeResult, boolean prefSaveRealImage) {
+ HistoryItem currentHistoryItem = new HistoryItem();
+
+ Bitmap image;
+ if (prefSaveRealImage) {
+ float height;
+ float width;
+ if (mCodeImage.getWidth() == 0 || mCodeImage.getWidth() == 0) {
+ height = 200f;
+ width = 200f;
+ } else if (mCodeImage.getWidth() > mCodeImage.getHeight()) {
+ height = (float) mCodeImage.getHeight() / (float) mCodeImage.getWidth() * 200f;
+ width = 200f;
+ } else {
+ width = (float) mCodeImage.getWidth() / (float) mCodeImage.getHeight() * 200f;
+ height = 200f;
+ }
+ image = Bitmap.createScaledBitmap(mCodeImage, (int) width, (int) height, false);
+ } else {
+ image = Utils.generateCode(currentBarcodeResult.getText(), currentBarcodeResult.getBarcodeFormat(), null, currentBarcodeResult.getResult().getResultMetadata());
+ }
+ currentHistoryItem.setImage(image);
+
+ currentHistoryItem.setFormat(currentBarcodeResult.getResult().getBarcodeFormat());
+ currentHistoryItem.setNumBits(currentBarcodeResult.getResult().getNumBits());
+ currentHistoryItem.setRawBytes(currentBarcodeResult.getResult().getRawBytes());
+ currentHistoryItem.setResultPoints(currentBarcodeResult.getResult().getResultPoints());
+ currentHistoryItem.setText(currentBarcodeResult.getResult().getText());
+ currentHistoryItem.setTimestamp(currentBarcodeResult.getResult().getTimestamp());
+
+ return currentHistoryItem;
+ }
}
diff --git a/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/ui/activities/generator/QrGeneratorDisplayActivity.java b/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/ui/activities/generator/QrGeneratorDisplayActivity.java
index 8f42b0df..e316114a 100644
--- a/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/ui/activities/generator/QrGeneratorDisplayActivity.java
+++ b/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/ui/activities/generator/QrGeneratorDisplayActivity.java
@@ -1,10 +1,15 @@
package com.secuso.privacyfriendlycodescanner.qrscanner.ui.activities.generator;
+import static com.secuso.privacyfriendlycodescanner.qrscanner.helpers.PrefManager.PREF_SAVE_REAL_IMAGE_TO_HISTORY;
+
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@@ -20,18 +25,25 @@
import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
+import androidx.lifecycle.ViewModelProvider;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.BitmapImageViewTarget;
import com.google.android.material.textfield.TextInputLayout;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.journeyapps.barcodescanner.BarcodeResult;
import com.secuso.privacyfriendlycodescanner.qrscanner.R;
+import com.secuso.privacyfriendlycodescanner.qrscanner.database.AppRepository;
+import com.secuso.privacyfriendlycodescanner.qrscanner.database.HistoryItem;
import com.secuso.privacyfriendlycodescanner.qrscanner.generator.Contents;
import com.secuso.privacyfriendlycodescanner.qrscanner.generator.QRGeneratorUtils;
+import com.secuso.privacyfriendlycodescanner.qrscanner.helpers.Utils;
import com.secuso.privacyfriendlycodescanner.qrscanner.ui.activities.ScannerActivity;
import com.secuso.privacyfriendlycodescanner.qrscanner.ui.helpers.IconArrayAdapter;
+import com.secuso.privacyfriendlycodescanner.qrscanner.ui.viewmodel.ScannerViewModel;
+import java.io.IOException;
import java.util.Arrays;
public class QrGeneratorDisplayActivity extends AppCompatActivity {
@@ -203,6 +215,7 @@ private void saveImageToStorage() {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.share, menu);
+ getMenuInflater().inflate(R.menu.save, menu);
return true;
}
@@ -211,6 +224,31 @@ public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.share) {
QRGeneratorUtils.shareImage(this, QRGeneratorUtils.getCachedUri());
return true;
+ } else if (item.getItemId() == R.id.save) {
+ // Use an instance of ScannerViewModel to get the BarcodeResult by 'scanning' the image
+ ScannerViewModel scannerViewModel = new ViewModelProvider(this).get(ScannerViewModel.class);
+ scannerViewModel.isScanComplete().observe(this, scanComplete -> {
+ if (scanComplete) {
+ BarcodeResult result = scannerViewModel.getScanResult().getValue();
+ scannerViewModel.clearScanResult();
+ if (result == null) {
+ Toast.makeText(this, getText(R.string.something_went_wrong), Toast.LENGTH_SHORT).show();
+ } else {
+ try {
+ //Get the Bitmap, create the HistoryItem and insert it into the db.
+ Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), QRGeneratorUtils.getCachedUri());
+ HistoryItem historyItem = Utils.createHistoryItem(bitmap, result, PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(PREF_SAVE_REAL_IMAGE_TO_HISTORY, false));
+ AppRepository.getInstance(getApplication()).insertHistoryEntry(historyItem);
+
+ Toast.makeText(this, getText(R.string.activity_result_toast_saved), Toast.LENGTH_SHORT).show();
+ } catch (IOException e) {
+ Toast.makeText(this, getText(R.string.something_went_wrong), Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+ });
+ //Start the 'scan'
+ scannerViewModel.getBarcodeResultFromImage(QRGeneratorUtils.getCachedUri());
}
return super.onOptionsItemSelected(item);
}
diff --git a/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/ui/viewmodel/ResultViewModel.java b/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/ui/viewmodel/ResultViewModel.java
index fd9b2708..a231fa93 100644
--- a/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/ui/viewmodel/ResultViewModel.java
+++ b/app/src/main/java/com/secuso/privacyfriendlycodescanner/qrscanner/ui/viewmodel/ResultViewModel.java
@@ -1,5 +1,7 @@
package com.secuso.privacyfriendlycodescanner.qrscanner.ui.viewmodel;
+import static com.secuso.privacyfriendlycodescanner.qrscanner.helpers.PrefManager.PREF_SAVE_REAL_IMAGE_TO_HISTORY;
+
import android.app.Application;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
@@ -20,8 +22,6 @@
import com.secuso.privacyfriendlycodescanner.qrscanner.database.HistoryItem;
import com.secuso.privacyfriendlycodescanner.qrscanner.helpers.Utils;
-import static com.secuso.privacyfriendlycodescanner.qrscanner.helpers.PrefManager.PREF_SAVE_REAL_IMAGE_TO_HISTORY;
-
public class ResultViewModel extends AndroidViewModel {
private BarcodeResult currentBarcodeResult = null;
@@ -73,7 +73,7 @@ public void initFromScan(BarcodeResult barcodeResult) {
mCodeImage = Utils.generateCode(currentBarcodeResult.getText(), currentBarcodeResult.getBarcodeFormat(), null, currentBarcodeResult.getResult().getResultMetadata());
}
- createHistoryItem();
+ currentHistoryItem = Utils.createHistoryItem(mCodeImage, barcodeResult, mPreferences.getBoolean(PREF_SAVE_REAL_IMAGE_TO_HISTORY, false));
if (mPreferences.getBoolean("bool_history", true)) {
this.saveHistoryItem(currentHistoryItem);
}
@@ -89,38 +89,6 @@ public void updateHistoryItem(HistoryItem item) {
AppRepository.getInstance(getApplication()).updateHistoryEntry(item);
}
- private void createHistoryItem() {
- currentHistoryItem = new HistoryItem();
-
- Bitmap image;
- boolean prefSaveRealImage = mPreferences.getBoolean(PREF_SAVE_REAL_IMAGE_TO_HISTORY, false);
- if (prefSaveRealImage) {
- float height;
- float width;
- if (mCodeImage.getWidth() == 0 || mCodeImage.getWidth() == 0) {
- height = 200f;
- width = 200f;
- } else if (mCodeImage.getWidth() > mCodeImage.getHeight()) {
- height = (float) mCodeImage.getHeight() / (float) mCodeImage.getWidth() * 200f;
- width = 200f;
- } else {
- width = (float) mCodeImage.getWidth() / (float) mCodeImage.getHeight() * 200f;
- height = 200f;
- }
- image = Bitmap.createScaledBitmap(mCodeImage, (int) width, (int) height, false);
- } else {
- image = Utils.generateCode(currentBarcodeResult.getText(), currentBarcodeResult.getBarcodeFormat(), null, currentBarcodeResult.getResult().getResultMetadata());
- }
- currentHistoryItem.setImage(image);
-
- currentHistoryItem.setFormat(currentBarcodeResult.getResult().getBarcodeFormat());
- currentHistoryItem.setNumBits(currentBarcodeResult.getResult().getNumBits());
- currentHistoryItem.setRawBytes(currentBarcodeResult.getResult().getRawBytes());
- currentHistoryItem.setResultPoints(currentBarcodeResult.getResult().getResultPoints());
- currentHistoryItem.setText(currentBarcodeResult.getResult().getText());
- currentHistoryItem.setTimestamp(currentBarcodeResult.getResult().getTimestamp());
- }
-
/**
* Sometimes the result points array of currentBarcodeResult includes null objects, what might lead to crashes.
* This function fills the array with duplicates from a valid ResultPoint or with a new ResultPoint with coordinates (0.0,0.0).
diff --git a/app/src/main/res/menu/save.xml b/app/src/main/res/menu/save.xml
index ee817c41..2ed1a9c9 100644
--- a/app/src/main/res/menu/save.xml
+++ b/app/src/main/res/menu/save.xml
@@ -5,7 +5,7 @@
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 5dc8d6a9..ead8d47d 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -345,5 +345,7 @@
Fehlerkorrektur-Level
Format
Es konnte kein Code generiert werden.
+ Etwas ist schief gelaufen
+ In der Historie speichern
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 3b6510cd..c386d856 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -352,6 +352,8 @@
Livello di correzione degli errori
Formato
Non è stato possibile generare alcun codice.
+ Qualcosa è andato storto
+ Salva nella cronologia
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 16913943..e5a35f67 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -352,5 +352,7 @@
Foutcorrectieniveau
Formaat
Er kon geen code worden gegenereerd.
+ Er ging iets mis
+ Opslaan in geschiedenis
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 188568ea..96e22f5d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -180,6 +180,7 @@
- Vehicle Identification Number (VIN)
+ Something went wrong
Copied to clipboard.
No name specified
@@ -256,6 +257,7 @@
Format
Error correction level
No code could be generated.
+ Save to history
Text
You can enter any text you want to encode. Multiple lines are allowed.