From 503e057effc47073d4da3ec95c29b7c492fb1702 Mon Sep 17 00:00:00 2001
From: GiuseppeS
Date: Tue, 2 Jul 2019 19:05:59 +0200
Subject: [PATCH] =?UTF-8?q?[FEAT]=20Implementata=20descrizione=20testuale?=
=?UTF-8?q?=20delle=20quantit=C3=A0=20di=20cui=20fare=20pick=20[BUG]=20Ris?=
=?UTF-8?q?olto=20strano=20problema=20che=20faceva=20selezionare=20ordini?=
=?UTF-8?q?=20random=20in=20avantielenco=20spedizione?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/caches/build_file_checksums.ser | Bin 964 -> 964 bytes
app/build.gradle | 3 +-
.../core/di/BindableBoolean.java | 71 ++++-
.../vendita/core/MainListVenditaAdapter.java | 28 +-
.../ui/CheckBoxThreeStates.java | 293 ++++++++++++++++++
.../input_quantity/DialogInputQuantity.java | 45 +++
.../layout/dialog_input_quantity_articolo.xml | 9 +
.../layout/vendita_main_list_group_model.xml | 6 +-
.../res/layout/vendita_main_list_model.xml | 25 +-
app/src/main/res/values-it/strings.xml | 9 +
app/src/main/res/values/strings.xml | 10 +-
11 files changed, 471 insertions(+), 28 deletions(-)
create mode 100644 app/src/main/java/it/integry/integrywmsnative/ui/CheckBoxThreeStates.java
diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index 4c745cc92a601727d71ca7f91878d9a1bd5872df..bb89238ddf2c833f4bb05df461e8dbbb8b56f9f9 100644
GIT binary patch
delta 37
vcmV+=0NVe=2gC=Em;|y^dEv2~2LceWLV&_BR to be used as fieldId.
+ *
+ * @param fieldId The generated BR id for the Bindable field.
+ */
+ public void notifyPropertyChanged(int fieldId) {
+ synchronized (this) {
+ if (mCallbacks == null) {
+ return;
+ }
+ }
+ mCallbacks.notifyCallbacks(this, fieldId, null);
+ }
+
public boolean get() {
return mValue;
}
diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/core/MainListVenditaAdapter.java b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/core/MainListVenditaAdapter.java
index 01e8dcc2..4e17a907 100644
--- a/app/src/main/java/it/integry/integrywmsnative/gest/vendita/core/MainListVenditaAdapter.java
+++ b/app/src/main/java/it/integry/integrywmsnative/gest/vendita/core/MainListVenditaAdapter.java
@@ -29,8 +29,6 @@ public class MainListVenditaAdapter extends SectionedRecyclerViewAdapter mCallbacksDictionary = new HashMap<>();
-
private List mDataset;
private RunnableArgs mOnSingleSelectionChanged;
@@ -103,6 +101,10 @@ public class MainListVenditaAdapter extends SectionedRecyclerViewAdapter x.getCodAnagOrd().equals(mDataset.get(nextItemPosition).getCodAnagOrd()))
.anyMatch(OrdineVenditaInevasoDTO::isSelected);
+ List ordersToSelect =
+ Stream.of(mDataset)
+ .filter(x -> x.getCodAnagOrd().equals(mDataset.get(nextItemPosition).getCodAnagOrd())).toList();
+
Stream.of(mDataset)
.filter(x -> x.getCodAnagOrd().equals(mDataset.get(nextItemPosition).getCodAnagOrd()))
.forEach(x -> x.setSelected(!anySelected));
@@ -110,14 +112,15 @@ public class MainListVenditaAdapter extends SectionedRecyclerViewAdapter {
ordine.setSelected(isChecked);
mOnSingleSelectionChanged.run(ordine);
});
-
- ordine.selected.addOnPropertyChangedCallback(mCallbacksDictionary.get(ordine.selected));
}
diff --git a/app/src/main/java/it/integry/integrywmsnative/ui/CheckBoxThreeStates.java b/app/src/main/java/it/integry/integrywmsnative/ui/CheckBoxThreeStates.java
new file mode 100644
index 00000000..62cf64fd
--- /dev/null
+++ b/app/src/main/java/it/integry/integrywmsnative/ui/CheckBoxThreeStates.java
@@ -0,0 +1,293 @@
+package it.integry.integrywmsnative.ui;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.ViewDebug;
+
+import androidx.annotation.ArrayRes;
+import androidx.appcompat.widget.AppCompatCheckBox;
+
+import it.integry.integrywmsnative.R;
+
+public class CheckBoxThreeStates extends AppCompatCheckBox {
+
+
+ private boolean mBroadcasting;
+ private boolean mIndeterminate;
+
+ private OnCheckedChangeListener mOnCheckedChangeListener;
+
+
+ private static final int[] INDETERMINATE_STATE_SET = {
+// R.attr.state_indeterminate
+ };
+
+ private static final int[] DEFAULT_CYCLE = {
+ 1, 0, 1, 0
+ };
+
+ private int[] mCycle = DEFAULT_CYCLE;
+
+// public CheckBoxThreeStates(final Context context) {
+// this(context, null);
+// }
+
+// public CheckBoxThreeStates(final Context context, final AttributeSet attrs) {
+// this(context, attrs, R.attr.checkbox3Style);
+// }
+
+ public CheckBoxThreeStates(final Context context, final AttributeSet attrs, final int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+/*
+ final TypedArray a =
+ context.obtainStyledAttributes(attrs, R.styleable.CheckBox3, defStyleAttr, R.style.Widget_Checkbox3);
+
+ try {
+
+ if (a.hasValue(R.styleable.CheckBox3_checkbox3_checkableCycle)) {
+ int cycleRes = a.getResourceId(R.styleable.CheckBox3_checkbox3_checkableCycle, 0);
+ if (cycleRes != 0) {
+ setCycle(getResources().getIntArray(cycleRes));
+ }
+ }
+
+ if (a.hasValue(R.styleable.CheckBox3_android_fontFamily)) {
+ final String font = a.getString(R.styleable.CheckBox3_android_fontFamily);
+ setTypeface(TypefaceUtils.loadFromAsset(getResources().getAssets(), font));
+ }
+
+ final boolean indeterminate = a.getBoolean(R.styleable.CheckBox3_checkbox3_indeterminate, false);
+ final boolean checked = a.getBoolean(R.styleable.CheckBox3_android_checked, false);
+
+ mBroadcasting = true;
+
+ int index = getStateIndex(checked, indeterminate);
+ if (!isValidStateIndex(index)) {
+ index = getFirstValidStateIndex(index);
+ }
+ moveToState(index);
+
+ } finally {
+ a.recycle();
+ }
+ */
+ }
+
+ public void setCycle(@ArrayRes final int cycleRes) {
+ setCycle(getResources().getIntArray(cycleRes));
+ }
+
+ /**
+ * Change the cycle used to determine the next state of the checkbox when the user
+ * click the component, or when the {@link #toggle()} is called.
+ * The value passed is an array of 4 integer elements, representing the state of the checkbox.
+ * The value of each element can be 0 or 1, with 0 to disable the state and 1 to enable the state.
+ * The states are (in order):
+ *
+ * - Checked
+ * - Indeterminate (checked)
+ * - Unchecked
+ * - Indeterminate (unchecked)
+ *
+ * So if a cycle like this one is used:
+ * int[] cycle = new int[]{1,0,1,0}
+ * the checkbox will only cycle between checked and unchecked state.
+ * The default cycle is: {1,0,1,0}
+ *
+ *
The method throws an exception if the array is not valid. A valid array must match the following rules:
+ *
+ * - If not null, must have 4 elements
+ * - At least 2 elements must be not equal to 0
+ *
+ *
+ * @param cycle change the cycle
+ */
+ public void setCycle(final int[] cycle) {
+ validateCycle(cycle);
+ mCycle = cycle == null ? DEFAULT_CYCLE : cycle;
+ }
+
+ /**
+ * Move to the next state of the checkbox
+ */
+ @Override
+ public void toggle() {
+ if (null == mCycle) return;
+
+ final int currentIndex = getCurrentStateIndex();
+ moveToNextState(currentIndex);
+ }
+
+ @Override
+ public void setChecked(boolean checked) {
+ if (null == mCycle) return;
+
+ int index = getStateIndex(checked, isIndeterminate());
+ if (!isValidStateIndex(index)) {
+ return;
+ }
+
+ super.setChecked(checked);
+ }
+
+ /**
+ * Change the state of the checkbox
+ *
+ * @param checked
+ * @param indeterminate
+ */
+ public void setChecked(boolean checked, boolean indeterminate) {
+ if (null == mCycle) return;
+
+ if (isChecked() == checked) {
+ setIndeterminate(indeterminate);
+ } else {
+ mIndeterminate = indeterminate;
+ }
+ setChecked(checked);
+ }
+
+ @ViewDebug.ExportedProperty
+ public boolean isIndeterminate() {
+ return mIndeterminate;
+ }
+
+ public void setIndeterminate(boolean indeterminate) {
+ if (null == mCycle) return;
+
+ int index = getStateIndex(isChecked(), indeterminate);
+ if (!isValidStateIndex(index)) {
+ return;
+ }
+
+ setIndeterminateImpl(indeterminate, true);
+ }
+
+ private void moveToNextState(final int index) {
+ int nextIndex = getNextValidIndex(index);
+ boolean checked = nextIndex < 2;
+ mIndeterminate = nextIndex == 1 || nextIndex == 3;
+ setChecked(checked);
+ }
+
+ private void moveToState(final int nextIndex) {
+ if (!isValidStateIndex(nextIndex)) {
+ }
+ boolean checked = nextIndex < 2;
+ mIndeterminate = nextIndex == 1 || nextIndex == 3;
+ setChecked(checked);
+ }
+
+
+ private void validateCycle(final int[] cycle) {
+ if (null == cycle) {
+ return;
+ }
+ if (cycle.length != 4) {
+ throw new IllegalArgumentException("Invalid cycle length. Expected 4 an array or 4 int");
+ }
+
+ int total = 0;
+ for (final int i1 : cycle) {
+ if (i1 != 0) {
+ total++;
+ }
+ }
+ if (total < 2) {
+ throw new IllegalArgumentException("Invalid cycle. At least 2 elements must be positive");
+ }
+ }
+
+ private int getCurrentStateIndex() {
+ return getStateIndex(isChecked(), isIndeterminate());
+ }
+
+ private int getStateIndex(boolean checked, boolean indeterminate) {
+ int index = 0;
+ if (checked) {
+ index += indeterminate ? 1 : 0;
+ } else {
+ index = indeterminate ? 3 : 2;
+ }
+ return index;
+ }
+
+ private int getFirstValidStateIndex(int index) {
+ int i = index;
+ while (i >= 0) {
+ if (mCycle[i] != 0) return i;
+ i--;
+ }
+
+ i = index;
+ while (i < mCycle.length) {
+ if (mCycle[i] != 0) return i;
+ i++;
+ }
+
+ return -1;
+ }
+
+ private boolean isValidStateIndex(int index) {
+ return mCycle[index] != 0;
+ }
+
+ private int getNextValidIndex(int index) {
+ int nextIndex = index + 1 >= mCycle.length ? 0 : index + 1;
+ if (mCycle[nextIndex] != 0) {
+ return nextIndex;
+ }
+ return getNextValidIndex(nextIndex);
+ }
+
+ @Override
+ public void setOnCheckedChangeListener(final OnCheckedChangeListener listener) {
+ super.setOnCheckedChangeListener(listener);
+ mOnCheckedChangeListener = listener;
+ }
+
+ @Override
+ protected int[] onCreateDrawableState(int extraSpace) {
+ final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
+ if (isIndeterminate()) {
+ mergeDrawableStates(drawableState, INDETERMINATE_STATE_SET);
+ }
+ return drawableState;
+ }
+
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+ }
+
+ private void setIndeterminateImpl(boolean indeterminate, boolean notify) {
+ if (mIndeterminate != indeterminate) {
+ mIndeterminate = indeterminate;
+ refreshDrawableState();
+ if (notify) {
+ notifyStateListener();
+ }
+ }
+ }
+
+ private void notifyStateListener() {
+ if (mBroadcasting) {
+ return;
+ }
+
+ mBroadcasting = true;
+
+ if (mOnCheckedChangeListener != null) {
+ mOnCheckedChangeListener.onCheckedChanged(this, isChecked());
+ }
+ mBroadcasting = false;
+
+ }
+
+ @Override
+ public CharSequence getAccessibilityClassName() {
+ return CheckBoxThreeStates.class.getName();
+ }
+
+}
diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity/DialogInputQuantity.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity/DialogInputQuantity.java
index b288d59a..190a6064 100644
--- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity/DialogInputQuantity.java
+++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity/DialogInputQuantity.java
@@ -5,6 +5,7 @@ import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.ColorStateList;
+
import androidx.databinding.DataBindingUtil;
import androidx.databinding.Observable;
@@ -40,6 +41,7 @@ import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.core.utility.UtilityLogger;
+import it.integry.integrywmsnative.core.utility.UtilityNumber;
import it.integry.integrywmsnative.core.utility.UtilityProgress;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.databinding.DialogInputQuantityArticoloBinding;
@@ -371,6 +373,8 @@ public class DialogInputQuantity {
quantityDTO.expireDate = c.getTime();
}
+ refreshQtaDescriptionText();
+
}
@@ -502,6 +506,8 @@ public class DialogInputQuantity {
}
}
+
+// refreshQtaDescriptionText();
}
});
@@ -537,6 +543,7 @@ public class DialogInputQuantity {
}
}
+// refreshQtaDescriptionText();
}
});
@@ -567,6 +574,8 @@ public class DialogInputQuantity {
}
}
+
+// refreshQtaDescriptionText();
}
});
@@ -627,6 +636,42 @@ public class DialogInputQuantity {
}
+ private void refreshQtaDescriptionText() {
+
+ int numConf = (int) (currentQuantityDto.qtaDaEvadere.get() / currentQuantityDto.qtaCnf.get());
+ float qtaTot = currentQuantityDto.qtaDaEvadere.get().floatValue();
+
+ float mod = qtaTot % numConf;
+
+ String text = "";
+
+ if(numConf > 0) {
+ text += "" + numConf + " " + currentContext.getResources().getQuantityString(R.plurals.item_package, numConf).toUpperCase() + "";
+ }
+ if(numConf > 0 && mod > 0) {
+ text += " e ";
+ }
+ if(mod > 0) {
+
+ text += "" + UtilityNumber.decimalToString(mod) + " ";
+ if(mod == 1) {
+ text += currentContext.getResources().getQuantityString(R.plurals.pieces, (int) mod).toUpperCase();
+ } else {
+ text += currentContext.getString(R.string.piece).toUpperCase();
+ }
+
+ text += "";
+
+
+
+ }
+
+ currentBinding.qtaDescriptionText.setText(Html.fromHtml(text));
+
+ }
+
+
+
private void onConfirm(Context context, QuantityDTO quantityDTO, RunnableArgss dialogCallback, boolean closeUL){
if(currentDTO.mtbAart.isFlagTracciabilita() && (quantityDTO.batchLot == null || quantityDTO.batchLot.get().trim().length() == 0)){
diff --git a/app/src/main/res/layout/dialog_input_quantity_articolo.xml b/app/src/main/res/layout/dialog_input_quantity_articolo.xml
index ab6504e0..f6283472 100644
--- a/app/src/main/res/layout/dialog_input_quantity_articolo.xml
+++ b/app/src/main/res/layout/dialog_input_quantity_articolo.xml
@@ -213,6 +213,15 @@
+
+
diff --git a/app/src/main/res/layout/vendita_main_list_group_model.xml b/app/src/main/res/layout/vendita_main_list_group_model.xml
index 001e2b32..20fc1109 100644
--- a/app/src/main/res/layout/vendita_main_list_group_model.xml
+++ b/app/src/main/res/layout/vendita_main_list_group_model.xml
@@ -14,7 +14,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingStart="8dp"
+ android:paddingStart="2dp"
android:paddingEnd="4dp">
@@ -30,7 +30,7 @@
android:background="@color/full_white">
-
-
+
+
+
+
+
+
+
+
+
+ android:paddingStart="12dp"
+ android:paddingTop="8dp"
+ android:paddingEnd="8dp"
+ android:paddingBottom="8dp">
-
+
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index b6edd4b4..31a9a986 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -77,6 +77,14 @@
- %d ordine]]>
- %d ordini]]>
+
+ - @string/piece
+ - pezzi
+
+
+ - confezione
+ - confezioni
+
Chiudi UL
Articoli presenti
Ordini
@@ -85,6 +93,7 @@
Data
Posizione
Preparato da
+ Pezzo
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f58d92bf..764bf300 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -75,6 +75,14 @@
- %d order selected]]>
- %d orders selected]]>
+
+ - @string/piece
+ - pieces
+
+
+ - package
+ - packages
+
Close LU
Submitted items
Orders
@@ -86,7 +94,7 @@
Picking not available
Please scan an item barcode
Extra item
-
+ Piece
between 3 and 30 alphanumeric characters
enter a valid username