diff --git a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java index 9ef6b7115..60ac03c0d 100644 --- a/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java +++ b/app/src/main/java/protect/card_locker/BarcodeImageWriterTask.java @@ -5,6 +5,7 @@ import android.os.AsyncTask; import android.util.Log; import android.view.View; import android.widget.ImageView; +import android.widget.TextView; import com.google.zxing.BarcodeFormat; import com.google.zxing.MultiFormatWriter; @@ -28,16 +29,18 @@ class BarcodeImageWriterTask extends AsyncTask private static final int MAX_WIDTH_2D = 500; private final WeakReference imageViewReference; + private final WeakReference textViewReference; private final String cardId; private final BarcodeFormat format; private final int imageHeight; private final int imageWidth; BarcodeImageWriterTask(ImageView imageView, String cardIdString, - BarcodeFormat barcodeFormat) + BarcodeFormat barcodeFormat, TextView textView) { // Use a WeakReference to ensure the ImageView can be garbage collected imageViewReference = new WeakReference<>(imageView); + textViewReference = new WeakReference<>(textView); cardId = cardIdString; format = barcodeFormat; @@ -58,6 +61,11 @@ class BarcodeImageWriterTask extends AsyncTask } } + BarcodeImageWriterTask(ImageView imageView, String cardIdString, BarcodeFormat barcodeFormat) + { + this(imageView, cardIdString, barcodeFormat, null); + } + private int getMaxWidth(BarcodeFormat format) { switch(format) @@ -175,16 +183,25 @@ class BarcodeImageWriterTask extends AsyncTask } imageView.setImageBitmap(result); + TextView textView = textViewReference.get(); if(result != null) { Log.i(TAG, "Displaying barcode"); imageView.setVisibility(View.VISIBLE); + + if (textView != null) { + textView.setVisibility(View.VISIBLE); + textView.setText(format.name()); + } } else { Log.i(TAG, "Barcode generation failed, removing image from display"); imageView.setVisibility(View.GONE); + if (textView != null) { + textView.setVisibility(View.GONE); + } } } } diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java index 18becdcc6..0c00615b7 100644 --- a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java @@ -11,11 +11,13 @@ import androidx.appcompat.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; +import android.util.Pair; import android.view.MenuItem; import android.view.View; import android.view.ViewTreeObserver; import android.widget.EditText; import android.widget.ImageView; +import android.widget.TextView; import com.google.common.collect.ImmutableMap; import com.google.zxing.BarcodeFormat; @@ -58,7 +60,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity BarcodeFormat.UPC_A.name() )); - private Map barcodeViewMap; + private Map> barcodeViewMap; private LinkedList barcodeGeneratorTasks = new LinkedList<>(); @Override @@ -75,18 +77,18 @@ public class BarcodeSelectorActivity extends AppCompatActivity actionBar.setDisplayHomeAsUpEnabled(true); } - barcodeViewMap = ImmutableMap.builder() - .put(BarcodeFormat.AZTEC.name(), R.id.aztecBarcode) - .put(BarcodeFormat.CODE_39.name(), R.id.code39Barcode) - .put(BarcodeFormat.CODE_128.name(), R.id.code128Barcode) - .put(BarcodeFormat.CODABAR.name(), R.id.codabarBarcode) - .put(BarcodeFormat.DATA_MATRIX.name(), R.id.datamatrixBarcode) - .put(BarcodeFormat.EAN_8.name(), R.id.ean8Barcode) - .put(BarcodeFormat.EAN_13.name(), R.id.ean13Barcode) - .put(BarcodeFormat.ITF.name(), R.id.itfBarcode) - .put(BarcodeFormat.PDF_417.name(), R.id.pdf417Barcode) - .put(BarcodeFormat.QR_CODE.name(), R.id.qrcodeBarcode) - .put(BarcodeFormat.UPC_A.name(), R.id.upcaBarcode) + barcodeViewMap = ImmutableMap.>builder() + .put(BarcodeFormat.AZTEC.name(), new Pair<>(R.id.aztecBarcode, R.id.aztecBarcodeText)) + .put(BarcodeFormat.CODE_39.name(), new Pair<>(R.id.code39Barcode, R.id.code39BarcodeText)) + .put(BarcodeFormat.CODE_128.name(), new Pair<>(R.id.code128Barcode, R.id.code128BarcodeText)) + .put(BarcodeFormat.CODABAR.name(), new Pair<>(R.id.codabarBarcode, R.id.codabarBarcodeText)) + .put(BarcodeFormat.DATA_MATRIX.name(), new Pair<>(R.id.datamatrixBarcode, R.id.datamatrixBarcodeText)) + .put(BarcodeFormat.EAN_8.name(), new Pair<>(R.id.ean8Barcode, R.id.ean8BarcodeText)) + .put(BarcodeFormat.EAN_13.name(), new Pair<>(R.id.ean13Barcode, R.id.ean13BarcodeText)) + .put(BarcodeFormat.ITF.name(), new Pair<>(R.id.itfBarcode, R.id.itfBarcodeText)) + .put(BarcodeFormat.PDF_417.name(), new Pair<>(R.id.pdf417Barcode, R.id.pdf417BarcodeText)) + .put(BarcodeFormat.QR_CODE.name(), new Pair<>(R.id.qrcodeBarcode, R.id.qrcodeBarcodeText)) + .put(BarcodeFormat.UPC_A.name(), new Pair<>(R.id.upcaBarcode, R.id.upcaBarcodeText)) .build(); EditText cardId = findViewById(R.id.cardId); @@ -113,8 +115,9 @@ public class BarcodeSelectorActivity extends AppCompatActivity // Update barcodes for(String key : barcodeViewMap.keySet()) { - ImageView image = findViewById(barcodeViewMap.get(key)); - createBarcodeOption(image, key, s.toString()); + ImageView image = findViewById(barcodeViewMap.get(key).first); + TextView text = findViewById(barcodeViewMap.get(key).second); + createBarcodeOption(image, key, s.toString(), text); } View noBarcodeButtonView = findViewById(R.id.noBarcode); @@ -153,7 +156,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity }); } - private void createBarcodeOption(final ImageView image, final String formatType, final String cardId) + private void createBarcodeOption(final ImageView image, final String formatType, final String cardId, final TextView text) { final BarcodeFormat format = BarcodeFormat.valueOf(formatType); if(format == null) @@ -198,7 +201,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity } Log.d(TAG, "Generating barcode for type " + formatType); - BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format); + BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text); barcodeGeneratorTasks.add(task); task.execute(); } @@ -207,7 +210,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity else { Log.d(TAG, "Generating barcode for type " + formatType); - BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format); + BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text); barcodeGeneratorTasks.add(task); task.execute(); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 3a45918c4..b6ac2cc41 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -104,7 +104,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity cardIdFieldView = findViewById(R.id.cardIdView); cardIdDivider = findViewById(R.id.cardIdDivider); cardIdTableRow = findViewById(R.id.cardIdTableRow); - barcodeTypeField = findViewById(R.id.barcodeType); + barcodeTypeField = findViewById(R.id.barcodeTypeView); barcodeImage = findViewById(R.id.barcode); barcodeImageLayout = findViewById(R.id.barcodeLayout); barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout); @@ -163,7 +163,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity if(barcodeTypeField.getText().length() == 0) { - barcodeTypeField.setText(loyaltyCard.barcodeType); + barcodeTypeField.setText(loyaltyCard.barcodeType.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : loyaltyCard.barcodeType); } if(headingColorValue == null) @@ -208,6 +208,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity else { setTitle(R.string.addCardTitle); + hideBarcode(); } if(headingColorValue == null) @@ -230,9 +231,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0) { - if(barcodeTypeField.getText().equals(NO_BARCODE)) + if(barcodeTypeField.getText().toString().equals(NO_BARCODE)) { - barcodeImageLayout.setVisibility(View.GONE); + hideBarcode(); } else { @@ -271,7 +272,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); } - barcodeImageLayout.setVisibility(View.VISIBLE); + showBarcode(); } } @@ -507,10 +508,21 @@ public class LoyaltyCardEditActivity extends AppCompatActivity TextView cardIdView = findViewById(R.id.cardIdView); cardIdView.setText(contents); - final TextView barcodeTypeField = findViewById(R.id.barcodeType); // Set special NO_BARCODE value to prevent onResume from overwriting it barcodeTypeField.setText(format.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : format); onResume(); } } + + private void showBarcode() { + barcodeImageLayout.setVisibility(View.VISIBLE); + findViewById(R.id.barcodeTypeDivider).setVisibility(View.VISIBLE); + findViewById(R.id.barcodeTypeTableRow).setVisibility(View.VISIBLE); + } + + private void hideBarcode() { + barcodeImageLayout.setVisibility(View.GONE); + findViewById(R.id.barcodeTypeDivider).setVisibility(View.GONE); + findViewById(R.id.barcodeTypeTableRow).setVisibility(View.GONE); + } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index f91014d68..f52de980e 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -405,6 +405,9 @@ public class LoyaltyCardViewActivity extends AppCompatActivity // Move barcode to top barcodeImage.setScaleType(ImageView.ScaleType.FIT_START); + // Prevent centering + barcodeImage.setAdjustViewBounds(false); + // Set current state barcodeIsFullscreen = true; } @@ -429,6 +432,9 @@ public class LoyaltyCardViewActivity extends AppCompatActivity // Turn barcode back to normal barcodeImage.setLayoutParams(barcodeImageState); + // Fix barcode centering + barcodeImage.setAdjustViewBounds(true); + // Set current state barcodeIsFullscreen = false; } diff --git a/app/src/main/res/layout/barcode_selector_activity.xml b/app/src/main/res/layout/barcode_selector_activity.xml index 8edd3374f..4e164d389 100644 --- a/app/src/main/res/layout/barcode_selector_activity.xml +++ b/app/src/main/res/layout/barcode_selector_activity.xml @@ -70,137 +70,236 @@ android:layout_height="wrap_content" android:text="@string/barcodeNoBarcode" android:enabled="false" /> - + - + - + - + - + - + - + - + - + - + - + diff --git a/app/src/main/res/layout/loyalty_card_edit_activity.xml b/app/src/main/res/layout/loyalty_card_edit_activity.xml index b523ae7d2..76e260824 100644 --- a/app/src/main/res/layout/loyalty_card_edit_activity.xml +++ b/app/src/main/res/layout/loyalty_card_edit_activity.xml @@ -335,16 +335,66 @@ android:background="@color/inputBorder" /> + + + + + + + + + + + + + + + - -