From 9a49fe3e3d0139906081f074695efdad8cff2268 Mon Sep 17 00:00:00 2001 From: Alex Leigh Date: Sun, 3 Sep 2023 22:08:27 -0700 Subject: [PATCH] ris: Skeleton of datamodel for RIS + client, barcode interactions, improvements to text handling, WIP on view fragment --- .../java/lc/ris/android/BarcodeBroker.java | 9 ++++-- ...stReceiver.java => DataWedgeReceiver.java} | 18 +++++++---- .../java/lc/ris/android/ItemFragment.java | 3 +- .../java/lc/ris/android/ScanFragment.java | 4 +-- .../java/lc/ris/client/InventoryStore.java | 18 +++++++++++ .../java/lc/ris/client/RAMInventoryStore.java | 20 +++++++++++++ .../lc/ris/client/RapidInventoryClient.java | 6 ++-- .../app/src/main/res/layout/fragment_item.xml | 30 +++++++++++++++++-- .../app/src/main/res/layout/fragment_scan.xml | 1 + 9 files changed, 93 insertions(+), 16 deletions(-) rename android/RapidInventorySystem/app/src/main/java/lc/ris/android/{ScanBroadcastReceiver.java => DataWedgeReceiver.java} (70%) create mode 100644 android/RapidInventorySystem/app/src/main/java/lc/ris/client/InventoryStore.java create mode 100644 android/RapidInventorySystem/app/src/main/java/lc/ris/client/RAMInventoryStore.java diff --git a/android/RapidInventorySystem/app/src/main/java/lc/ris/android/BarcodeBroker.java b/android/RapidInventorySystem/app/src/main/java/lc/ris/android/BarcodeBroker.java index 9a20f4d4a..67409ae20 100644 --- a/android/RapidInventorySystem/app/src/main/java/lc/ris/android/BarcodeBroker.java +++ b/android/RapidInventorySystem/app/src/main/java/lc/ris/android/BarcodeBroker.java @@ -16,6 +16,9 @@ import java.util.WeakHashMap; * getter on the activity, where they can register & unregister listeners as their lifecycle progresses. To * protect against memory leaks, this implementation only holds weak references to receivers. * + * Note that this class just transports the scanned transport; it is up to other code within RIS to make sense + * of the barcode and to decode the contents and associate it with an entityId. + * * @author Alex Leigh * @since mk1 */ @@ -30,10 +33,10 @@ public class BarcodeBroker { weakHashSet.remove(listener); } - public void publish(final String barcode) { - Log.i("RIS", "Publishing barcode scan: " + barcode); + public void publish(final String scannedCode) { + Log.i("RIS", "Publishing barcode scan: " + scannedCode); for (BarcodeListener listener : weakHashSet) { - listener.receiveBarcode(barcode); + listener.receiveBarcode(scannedCode); } } } diff --git a/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ScanBroadcastReceiver.java b/android/RapidInventorySystem/app/src/main/java/lc/ris/android/DataWedgeReceiver.java similarity index 70% rename from android/RapidInventorySystem/app/src/main/java/lc/ris/android/ScanBroadcastReceiver.java rename to android/RapidInventorySystem/app/src/main/java/lc/ris/android/DataWedgeReceiver.java index fdb3ed5fc..2db69f327 100644 --- a/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ScanBroadcastReceiver.java +++ b/android/RapidInventorySystem/app/src/main/java/lc/ris/android/DataWedgeReceiver.java @@ -5,10 +5,17 @@ import android.content.Context; import android.content.Intent; import android.util.Log; -public class ScanBroadcastReceiver extends BroadcastReceiver { +/** + * This class receives intent messages from the Zebra DataWedge application and uses that to process + * barcodes in the RIS application. + * + * @author Alex Leigh + * @since mk1 + */ +public class DataWedgeReceiver extends BroadcastReceiver { private final ScanFragment scanFragment; - public ScanBroadcastReceiver(ScanFragment scanFragment) { + public DataWedgeReceiver(ScanFragment scanFragment) { this.scanFragment = scanFragment; } @@ -17,7 +24,7 @@ public class ScanBroadcastReceiver extends BroadcastReceiver { String action = intent.getAction(); if (action.equals(scanFragment.getResources().getString(R.string.activity_intent_filter_action))) { try { - displayScanResult(intent, "via Broadcast"); + displayScanResult(intent); } catch (Exception e) { // Do nothing } @@ -28,10 +35,11 @@ public class ScanBroadcastReceiver extends BroadcastReceiver { * This method is called when we receive a barcode scan from the Zebra DataWedge, which arrives * via an Android intent. */ - private void displayScanResult(Intent initiatingIntent, String howDataReceived) { + private void displayScanResult(Intent initiatingIntent) { // Every time we get a hardware scan, we clear the contents of the text box. String decodedSource = initiatingIntent.getStringExtra(scanFragment.getResources().getString(R.string.datawedge_intent_key_source)); - String decodedData = initiatingIntent.getStringExtra(scanFragment.getResources().getString(R.string.datawedge_intent_key_data)); + String decodedData = initiatingIntent.getStringExtra( + scanFragment.getResources().getString(R.string.datawedge_intent_key_data)); String decodedLabelType = initiatingIntent.getStringExtra(scanFragment.getResources().getString(R.string.datawedge_intent_key_label_type)); Log.i("RIS", "Received hardware scan: " + decodedData); diff --git a/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ItemFragment.java b/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ItemFragment.java index 3ab1819fd..5cac8d6a9 100644 --- a/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ItemFragment.java +++ b/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ItemFragment.java @@ -47,8 +47,7 @@ public class ItemFragment extends Fragment implements BarcodeListener { @Override public void receiveBarcode(String barcode) { RapidInventoryClient client = ((MainActivity) getActivity()).getRisClient(); - Entity entity = client.getEntity(barcode); - + Entity entity = client.getInventoryStore().getEntity(barcode); final EditText et = getView().findViewById(R.id.formEntityNameInput); et.setText(entity.getEntityName()); } diff --git a/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ScanFragment.java b/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ScanFragment.java index 344f3278c..455c4244f 100644 --- a/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ScanFragment.java +++ b/android/RapidInventorySystem/app/src/main/java/lc/ris/android/ScanFragment.java @@ -22,7 +22,7 @@ import androidx.fragment.app.Fragment; * @since mk1 */ public class ScanFragment extends Fragment { - private ScanBroadcastReceiver myBroadcastReceiver; + private DataWedgeReceiver myBroadcastReceiver; public ScanFragment() { // Required empty public constructor @@ -33,7 +33,7 @@ public class ScanFragment extends Fragment { IntentFilter filter = new IntentFilter(); filter.addCategory(Intent.CATEGORY_DEFAULT); filter.addAction(getResources().getString(R.string.activity_intent_filter_action)); - myBroadcastReceiver = new ScanBroadcastReceiver(this); + myBroadcastReceiver = new DataWedgeReceiver(this); getActivity().registerReceiver(myBroadcastReceiver, filter); } diff --git a/android/RapidInventorySystem/app/src/main/java/lc/ris/client/InventoryStore.java b/android/RapidInventorySystem/app/src/main/java/lc/ris/client/InventoryStore.java new file mode 100644 index 000000000..1b1f2f1ae --- /dev/null +++ b/android/RapidInventorySystem/app/src/main/java/lc/ris/client/InventoryStore.java @@ -0,0 +1,18 @@ +package lc.ris.client; + +/** + * Classes implementing this interface provide access to a store of inventory information within the + * Rapid Inventory System. + * + * @author Alex Leigh + * @since mk1 + */ +public interface InventoryStore { + Entity getEntity(final String entityId); + + /** + * Attempt to locate an {@link Entity} based on a barcode scan. Where required this will attempt to decode the + * contents of the barcode. + */ + Entity getEntityFromBarcode(final String scan); +} diff --git a/android/RapidInventorySystem/app/src/main/java/lc/ris/client/RAMInventoryStore.java b/android/RapidInventorySystem/app/src/main/java/lc/ris/client/RAMInventoryStore.java new file mode 100644 index 000000000..206d5988e --- /dev/null +++ b/android/RapidInventorySystem/app/src/main/java/lc/ris/client/RAMInventoryStore.java @@ -0,0 +1,20 @@ +package lc.ris.client; + +/** + * This implementation of {@link InventoryStore} holds all of its information in RAM, and it most useful for + * debugging & test scenarios. + * + * @author Alex Leigh + * @since mk1 + */ +public class RAMInventoryStore implements InventoryStore { + @Override + public Entity getEntity(String entityId) { + return new Entity(entityId, "Entity - " + entityId); + } + + @Override + public Entity getEntityFromBarcode(String scan) { + return getEntity(scan); + } +} diff --git a/android/RapidInventorySystem/app/src/main/java/lc/ris/client/RapidInventoryClient.java b/android/RapidInventorySystem/app/src/main/java/lc/ris/client/RapidInventoryClient.java index 09224dcfd..84177c16a 100644 --- a/android/RapidInventorySystem/app/src/main/java/lc/ris/client/RapidInventoryClient.java +++ b/android/RapidInventorySystem/app/src/main/java/lc/ris/client/RapidInventoryClient.java @@ -13,9 +13,11 @@ import java.util.Objects; */ public class RapidInventoryClient { private final String universe; + private final InventoryStore inventoryStore; public RapidInventoryClient(String universe) { this.universe = universe; + this.inventoryStore = new RAMInventoryStore(); } @Override @@ -38,7 +40,7 @@ public class RapidInventoryClient { return Objects.hash(universe); } - public Entity getEntity(final String entityId) { - return new Entity(entityId, "Test Object"); + public InventoryStore getInventoryStore() { + return inventoryStore; } } diff --git a/android/RapidInventorySystem/app/src/main/res/layout/fragment_item.xml b/android/RapidInventorySystem/app/src/main/res/layout/fragment_item.xml index a78a6a13b..338b97633 100644 --- a/android/RapidInventorySystem/app/src/main/res/layout/fragment_item.xml +++ b/android/RapidInventorySystem/app/src/main/res/layout/fragment_item.xml @@ -20,7 +20,7 @@ android:ems="10" android:id="@+id/entityName" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/scanFragmentView" + app:layout_constraintTop_toBottomOf="@id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Name" app:layout_constraintEnd_toEndOf="parent"> @@ -28,9 +28,35 @@ + + + + + +