From fc902db170dbe151f1a5da0b699493018b1b1d1f Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Tue, 16 Nov 2021 23:56:07 +0100 Subject: [PATCH] Cleanup barcode selector --- .../card_locker/BarcodeSelectorActivity.java | 104 ++--- .../card_locker/BarcodeSelectorAdapter.java | 96 +++++ .../card_locker/CatimaBarcodeWithValue.java | 19 + .../protect/card_locker/MainActivity.java | 1 - app/src/main/res/layout/barcode_layout.xml | 22 ++ .../res/layout/barcode_selector_activity.xml | 364 ++++-------------- 6 files changed, 239 insertions(+), 367 deletions(-) create mode 100644 app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java create mode 100644 app/src/main/java/protect/card_locker/CatimaBarcodeWithValue.java create mode 100644 app/src/main/res/layout/barcode_layout.xml diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java index 6457f3b54..1dd034780 100644 --- a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java @@ -6,19 +6,15 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; 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 android.widget.ListView; import android.widget.Toast; import com.google.zxing.BarcodeFormat; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; @@ -30,20 +26,21 @@ import protect.card_locker.async.TaskHandler; * the data. The user may then select any barcode, where its * data and type will be returned to the caller. */ -public class BarcodeSelectorActivity extends CatimaAppCompatActivity { +public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements BarcodeSelectorAdapter.BarcodeSelectorListener { private static final String TAG = "Catima"; // Result this activity will return public static final String BARCODE_CONTENTS = "contents"; public static final String BARCODE_FORMAT = "format"; - private Map> barcodeViewMap; - final private TaskHandler mTasks = new TaskHandler(); private final Handler typingDelayHandler = new Handler(Looper.getMainLooper()); public static final Integer INPUT_DELAY = 250; + private ListView mBarcodeList; + private BarcodeSelectorAdapter mAdapter; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -56,21 +53,8 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity { actionBar.setDisplayHomeAsUpEnabled(true); } - barcodeViewMap = new HashMap<>(); - barcodeViewMap.put(BarcodeFormat.AZTEC.name(), new Pair<>(R.id.aztecBarcode, R.id.aztecBarcodeText)); - barcodeViewMap.put(BarcodeFormat.CODE_39.name(), new Pair<>(R.id.code39Barcode, R.id.code39BarcodeText)); - barcodeViewMap.put(BarcodeFormat.CODE_128.name(), new Pair<>(R.id.code128Barcode, R.id.code128BarcodeText)); - barcodeViewMap.put(BarcodeFormat.CODABAR.name(), new Pair<>(R.id.codabarBarcode, R.id.codabarBarcodeText)); - barcodeViewMap.put(BarcodeFormat.DATA_MATRIX.name(), new Pair<>(R.id.datamatrixBarcode, R.id.datamatrixBarcodeText)); - barcodeViewMap.put(BarcodeFormat.EAN_8.name(), new Pair<>(R.id.ean8Barcode, R.id.ean8BarcodeText)); - barcodeViewMap.put(BarcodeFormat.EAN_13.name(), new Pair<>(R.id.ean13Barcode, R.id.ean13BarcodeText)); - barcodeViewMap.put(BarcodeFormat.ITF.name(), new Pair<>(R.id.itfBarcode, R.id.itfBarcodeText)); - barcodeViewMap.put(BarcodeFormat.PDF_417.name(), new Pair<>(R.id.pdf417Barcode, R.id.pdf417BarcodeText)); - barcodeViewMap.put(BarcodeFormat.QR_CODE.name(), new Pair<>(R.id.qrcodeBarcode, R.id.qrcodeBarcodeText)); - barcodeViewMap.put(BarcodeFormat.UPC_A.name(), new Pair<>(R.id.upcaBarcode, R.id.upcaBarcodeText)); - barcodeViewMap.put(BarcodeFormat.UPC_E.name(), new Pair<>(R.id.upceBarcode, R.id.upceBarcodeText)); - EditText cardId = findViewById(R.id.cardId); + mBarcodeList = findViewById(R.id.barcodes); cardId.addTextChangedListener(new SimpleTextWatcher() { @Override @@ -108,11 +92,13 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity { mTasks.flushTaskList(TaskHandler.TYPE.BARCODE, true, false, false); // Update barcodes - for (Map.Entry> entry : barcodeViewMap.entrySet()) { - ImageView image = findViewById(entry.getValue().first); - TextView text = findViewById(entry.getValue().second); - createBarcodeOption(image, entry.getKey(), value, text); + ArrayList catimaBarcodeWithValues = new ArrayList<>(); + mAdapter = new BarcodeSelectorAdapter(this, catimaBarcodeWithValues, mTasks, this); + for (BarcodeFormat barcodeFormat : CatimaBarcode.barcodeFormats) { + CatimaBarcode catimaBarcode = CatimaBarcode.fromBarcode(barcodeFormat); + mAdapter.add(new CatimaBarcodeWithValue(catimaBarcode, value)); } + mBarcodeList.setAdapter(mAdapter); } private void setButtonListener(final View button, final String cardId) { @@ -126,48 +112,6 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity { }); } - private void createBarcodeOption(final ImageView image, final String formatType, final String cardId, final TextView text) { - final CatimaBarcode format = CatimaBarcode.fromName(formatType); - - image.setImageBitmap(null); - image.setOnClickListener(v -> { - Log.d(TAG, "Selected barcode type " + formatType); - - if (!((boolean) image.getTag())) { - Toast.makeText(BarcodeSelectorActivity.this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show(); - return; - } - - Intent result = new Intent(); - result.putExtra(BARCODE_FORMAT, formatType); - result.putExtra(BARCODE_CONTENTS, cardId); - BarcodeSelectorActivity.this.setResult(RESULT_OK, result); - finish(); - }); - - if (image.getHeight() == 0) { - // The size of the ImageView is not yet available as it has not - // yet been drawn. Wait for it to be drawn so the size is available. - image.getViewTreeObserver().addOnGlobalLayoutListener( - new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - Log.d(TAG, "Global layout finished, type: + " + formatType + ", width: " + image.getWidth()); - image.getViewTreeObserver().removeOnGlobalLayoutListener(this); - - Log.d(TAG, "Generating barcode for type " + formatType); - - BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), image, cardId, format, text, true, null); - mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); - } - }); - } else { - Log.d(TAG, "Generating barcode for type " + formatType); - BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getApplicationContext(), image, cardId, format, text, true, null); - mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); - } - } - @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { @@ -178,4 +122,26 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity { return super.onOptionsItemSelected(item); } + + @Override + public void onRowClicked(int inputPosition, View view) { + CatimaBarcodeWithValue barcodeWithValue = mAdapter.getItem(inputPosition); + CatimaBarcode catimaBarcode = barcodeWithValue.catimaBarcode(); + + if (!mAdapter.isValid(view)) { + Toast.makeText(this, getString(R.string.wrongValueForBarcodeType), Toast.LENGTH_LONG).show(); + return; + } + + String barcodeFormat = catimaBarcode.format().name(); + String value = barcodeWithValue.value(); + + Log.d(TAG, "Selected barcode type " + barcodeFormat); + + Intent result = new Intent(); + result.putExtra(BARCODE_FORMAT, barcodeFormat); + result.putExtra(BARCODE_CONTENTS, value); + BarcodeSelectorActivity.this.setResult(RESULT_OK, result); + finish(); + } } diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java b/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java new file mode 100644 index 000000000..ca3d35160 --- /dev/null +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java @@ -0,0 +1,96 @@ +package protect.card_locker; + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; + +import protect.card_locker.async.TaskHandler; + +public class BarcodeSelectorAdapter extends ArrayAdapter { + private static final String TAG = "Catima"; + + private final TaskHandler mTasks; + private final BarcodeSelectorListener mListener; + + private static class ViewHolder { + ImageView image; + TextView text; + } + + public interface BarcodeSelectorListener { + void onRowClicked(int inputPosition, View view); + } + + public BarcodeSelectorAdapter(Context context, ArrayList barcodes, TaskHandler taskHandler, BarcodeSelectorListener barcodeSelectorListener) { + super(context, 0, barcodes); + mTasks = taskHandler; + mListener = barcodeSelectorListener; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + CatimaBarcodeWithValue catimaBarcodeWithValue = getItem(position); + CatimaBarcode catimaBarcode = catimaBarcodeWithValue.catimaBarcode(); + String value = catimaBarcodeWithValue.value(); + + ViewHolder viewHolder; + if (convertView == null) { + viewHolder = new ViewHolder(); + LayoutInflater inflater = LayoutInflater.from(getContext()); + convertView = inflater.inflate(R.layout.barcode_layout, parent, false); + viewHolder.image = convertView.findViewById(R.id.barcodeImage); + viewHolder.text = convertView.findViewById(R.id.barcodeName); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + + createBarcodeOption(viewHolder.image, catimaBarcode.format().name(), value, viewHolder.text); + + View finalConvertView = convertView; + convertView.setOnClickListener(view -> mListener.onRowClicked(position, finalConvertView)); + + return convertView; + } + + public boolean isValid(View view) { + ViewHolder viewHolder = (ViewHolder) view.getTag(); + return viewHolder.image.getTag() != null && (boolean) viewHolder.image.getTag(); + } + + private void createBarcodeOption(final ImageView image, final String formatType, final String cardId, final TextView text) { + final CatimaBarcode format = CatimaBarcode.fromName(formatType); + + image.setImageBitmap(null); + + if (image.getHeight() == 0) { + // The size of the ImageView is not yet available as it has not + // yet been drawn. Wait for it to be drawn so the size is available. + image.getViewTreeObserver().addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + Log.d(TAG, "Global layout finished, type: + " + formatType + ", width: " + image.getWidth()); + image.getViewTreeObserver().removeOnGlobalLayoutListener(this); + + Log.d(TAG, "Generating barcode for type " + formatType); + + BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null); + mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); + } + }); + } else { + Log.d(TAG, "Generating barcode for type " + formatType); + BarcodeImageWriterTask barcodeWriter = new BarcodeImageWriterTask(getContext(), image, cardId, format, text, true, null); + mTasks.executeTask(TaskHandler.TYPE.BARCODE, barcodeWriter); + } + } +} diff --git a/app/src/main/java/protect/card_locker/CatimaBarcodeWithValue.java b/app/src/main/java/protect/card_locker/CatimaBarcodeWithValue.java new file mode 100644 index 000000000..cd02ea3ee --- /dev/null +++ b/app/src/main/java/protect/card_locker/CatimaBarcodeWithValue.java @@ -0,0 +1,19 @@ +package protect.card_locker; + +public class CatimaBarcodeWithValue { + private final CatimaBarcode mCatimaBarcode; + private final String mValue; + + public CatimaBarcodeWithValue(CatimaBarcode catimaBarcode, String value) { + mCatimaBarcode = catimaBarcode; + mValue = value; + } + + public CatimaBarcode catimaBarcode() { + return mCatimaBarcode; + } + + public String value() { + return mValue; + } +} diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 9722818f3..b4830c0ac 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -681,7 +681,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard } } - @Override public void onRowClicked(int inputPosition) { if (mAdapter.getSelectedItemCount() > 0) { diff --git a/app/src/main/res/layout/barcode_layout.xml b/app/src/main/res/layout/barcode_layout.xml new file mode 100644 index 000000000..0e94e54ad --- /dev/null +++ b/app/src/main/res/layout/barcode_layout.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/barcode_selector_activity.xml b/app/src/main/res/layout/barcode_selector_activity.xml index 83d280398..60dfb6be9 100644 --- a/app/src/main/res/layout/barcode_selector_activity.xml +++ b/app/src/main/res/layout/barcode_selector_activity.xml @@ -1,318 +1,88 @@ - + - - - + android:orientation="vertical"> + + + - - - - - - - - - -