diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java index 52eb0626..3c1c74c5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java @@ -238,8 +238,8 @@ public class MainApplicationModule { @Provides @Singleton - SystemRESTConsumer provideSystemRESTConsumer(RESTBuilder restBuilder) { - return new SystemRESTConsumer(restBuilder); + SystemRESTConsumer provideSystemRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder) { + return new SystemRESTConsumer(executorService, restBuilder); } @Provides diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java index 6267f717..59da80b3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumer.java @@ -13,6 +13,7 @@ import java.io.InputStreamReader; import java.io.Reader; import java.lang.reflect.Type; import java.util.List; +import java.util.concurrent.ExecutorService; import javax.inject.Singleton; @@ -36,9 +37,11 @@ import retrofit2.Response; @Singleton public class SystemRESTConsumer extends _BaseRESTConsumer { + private final ExecutorService executorService; private final RESTBuilder restBuilder; - public SystemRESTConsumer(RESTBuilder restBuilder) { + public SystemRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder) { + this.executorService = executorService; this.restBuilder = restBuilder; } @@ -161,20 +164,19 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { } - public void sendMail(MailRequestDTO mailDTO, Runnable onComplete, RunnableArgs onFailed) { - + public void sendMailSynchronized(MailRequestDTO mailDTO) throws Exception { SystemRESTConsumerService service = restBuilder.getService(SystemRESTConsumerService.class); - service.sendMail(mailDTO).enqueue(new ManagedErrorCallback<>() { - @Override - public void onResponse(Call> call, Response> response) { - if (onComplete != null) onComplete.run(); - } + var response = service.sendMail(mailDTO).execute(); + analyzeAnswer(response, "sendMail"); + } - @Override - public void onFailure(Call> call, @NonNull final Exception e) { - if (onFailed != null) { - onFailed.run(e); - } + public void sendMail(MailRequestDTO mailDTO, Runnable onComplete, RunnableArgs onFailed) { + executorService.execute(() -> { + try { + sendMailSynchronized(mailDTO); + if (onComplete != null) onComplete.run(); + } catch (Exception ex) { + if (onFailed != null) onFailed.run(ex); } }); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumerService.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumerService.java index 7c6f0662..3391b423 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumerService.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/SystemRESTConsumerService.java @@ -32,6 +32,6 @@ public interface SystemRESTConsumerService { Call>> getAvailableCodMdeps(); @POST("sendEmail") - Call> sendMail(@Body MailRequestDTO mailDto); + Call> sendMail(@Body MailRequestDTO mailDto); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java index e10e28c8..d98f7541 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsFragment.java @@ -3,8 +3,8 @@ package it.integry.integrywmsnative.gest.settings; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.Bundle; -import android.text.Html; -import android.text.SpannableString; +import android.os.Handler; +import android.os.Looper; import android.util.Base64; import android.widget.Toast; @@ -31,6 +31,7 @@ import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.concurrent.ExecutorService; +import java.util.stream.Collectors; import javax.inject.Inject; @@ -46,8 +47,8 @@ import it.integry.integrywmsnative.core.rest.model.MailAttachmentDTO; import it.integry.integrywmsnative.core.rest.model.MailRequestDTO; import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityResources; +import it.integry.integrywmsnative.view.dialogs.DialogConsts; import it.integry.integrywmsnative.view.dialogs.DialogProgressView; -import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; import it.integry.integrywmsnative.view.dialogs.yes_no.DialogYesNoView; public class MainSettingsFragment extends PreferenceFragmentCompat implements ITitledFragment, Preference.OnPreferenceChangeListener { @@ -126,8 +127,12 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT var triggerScanModeListPref = (ListPreference) findPreference(KEY_TRIGGER_SCAN_MODE); if (triggerScanModeListPref != null) { var scanModes = BarcodeSetting.getTriggerScanModes(); - triggerScanModeListPref.setEntries(scanModes); - triggerScanModeListPref.setEntryValues(scanModes); + + var values = scanModes.keySet().toArray(new String[0]); + var descriptions = scanModes.values().toArray(new CharSequence[0]); + + triggerScanModeListPref.setEntries(descriptions); + triggerScanModeListPref.setEntryValues(values); triggerScanModeListPref.setOnPreferenceChangeListener(this); } } @@ -150,15 +155,15 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT if (!btPairedDevices.isEmpty()) { CharSequence[] entries = new CharSequence[btPairedDevices.size()]; - Stream.of(btPairedDevices) + btPairedDevices.stream() .map(BluetoothDevice::getName) - .toList() + .collect(Collectors.toList()) .toArray(entries); CharSequence[] entryValues = new CharSequence[btPairedDevices.size()]; - Stream.of(btPairedDevices) + btPairedDevices.stream() .map(BluetoothDevice::getAddress) - .toList() + .collect(Collectors.toList()) .toArray(entryValues); lp.setEntries(entries); @@ -230,7 +235,12 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT private void exportLog() { + var handler = new Handler(Looper.getMainLooper()); + DialogYesNoView.newInstance("Esportazione log", "Vuoi inviare il log degli eventi al supporto?", result -> { + if (result == DialogConsts.Results.NO || result == DialogConsts.Results.ABORT) + return; + this.openProgress(); executorService.execute(() -> { @@ -246,7 +256,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT try { List attachmentDTOList = new ArrayList<>(); - if(fileToShare != null) { + if (fileToShare != null) { var htmlContent = createAppLogAttachment(fileToShare); byte[] buffer = htmlContent.getBytes();//specify the size to allow. @@ -265,7 +275,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT dbFiles[1] = requireContext().getDatabasePath("integry_wms-shm"); dbFiles[2] = requireContext().getDatabasePath("integry_wms-wal"); - for(int i = 0; i < dbFiles.length; i++){ + for (int i = 0; i < dbFiles.length; i++) { byte[] dbFileBytes = new byte[(int) dbFiles[i].length()]; FileInputStream inputStream = new FileInputStream(dbFiles[i]); final int read = inputStream.read(dbFileBytes); @@ -284,25 +294,14 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT .setAttachments(attachmentDTOList); - systemRESTConsumer.sendMail(mailRequest, this::closeProgress, ex -> { - this.closeProgress(); - requireActivity().runOnUiThread(() -> { - DialogSimpleMessageView - .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) - .show(requireActivity().getSupportFragmentManager(), "tag"); - }); - }); - } catch (Exception ex) { - UtilityExceptions.defaultException(requireContext(), ex); - this.closeProgress(); + systemRESTConsumer.sendMailSynchronized(mailRequest); -// requireActivity().runOnUiThread(() -> { -// DialogSimpleMessageView -// .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) -// .show(requireActivity().getSupportFragmentManager(), "tag"); -// }); -// -// FirebaseCrashlytics.getInstance().recordException(ex); + this.closeProgress(); + } catch (Exception ex) { + handler.post(() -> { + this.closeProgress(); + UtilityExceptions.defaultException(requireContext(), ex); + }); } }); }) @@ -310,16 +309,15 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT } - private void openProgress() { // executorService.execute(() -> { - this.mCurrentProgress.show(requireActivity().getSupportFragmentManager()); + this.mCurrentProgress.show(requireActivity().getSupportFragmentManager()); // }); } private void closeProgress() { // executorService.execute(() -> { - mCurrentProgress.dismiss(); + mCurrentProgress.dismiss(); // }); } @@ -334,7 +332,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT while ((line = br.readLine()) != null) { - if(!line.matches("\\d{13}.*")) { + if (!line.matches("\\d{13}.*")) { int lastNewLineChar = text.lastIndexOf("\n"); text.deleteCharAt(text.length() - 1); } @@ -411,7 +409,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT } htmlContent.append(""" - + diff --git a/app/src/main/java/it/integry/integrywmsnative/view/components/ConfirmSwitchPreferenceCompat.java b/app/src/main/java/it/integry/integrywmsnative/view/components/ConfirmSwitchPreferenceCompat.java new file mode 100644 index 00000000..4f791521 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/view/components/ConfirmSwitchPreferenceCompat.java @@ -0,0 +1,55 @@ +package it.integry.integrywmsnative.view.components; + + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; + +import androidx.fragment.app.FragmentActivity; +import androidx.preference.SwitchPreferenceCompat; + +import it.integry.integrywmsnative.R; +import it.integry.integrywmsnative.view.dialogs.DialogConsts; +import it.integry.integrywmsnative.view.dialogs.yes_no.DialogYesNoView; + +public class ConfirmSwitchPreferenceCompat extends SwitchPreferenceCompat { + + private final String confirmTitle; + private final String confirmMessage; + + public ConfirmSwitchPreferenceCompat(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ConfirmSwitchPreferenceCompat); + + String confirmTitle = a.getString(R.styleable.ConfirmSwitchPreferenceCompat_confirmTitle); + String confirmMessage = a.getString(R.styleable.ConfirmSwitchPreferenceCompat_confirmMessage); + + a.recycle(); + + if(confirmTitle == null) confirmTitle = "Confirm"; + if(confirmMessage == null) confirmMessage = "Are you sure you want to change this setting?"; + + this.confirmMessage = confirmMessage; + this.confirmTitle = confirmTitle; + } + + @Override + protected void onClick() { + if (isChecked()) { + // showConfirmationDialog(false); + setChecked(false); + } else { + showConfirmationDialog(true); + } + } + + private void showConfirmationDialog(final boolean newValue) { + + DialogYesNoView.newInstance(confirmTitle, confirmMessage, result -> { + if(result == DialogConsts.Results.YES) { + setChecked(newValue); + } + }).show(((FragmentActivity) getContext()).getSupportFragmentManager(), "dialog-enable-beta"); + } +} \ No newline at end of file diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/yes_no/DialogYesNoView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/yes_no/DialogYesNoView.java index a6fa284e..2d075187 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/yes_no/DialogYesNoView.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/yes_no/DialogYesNoView.java @@ -2,7 +2,6 @@ package it.integry.integrywmsnative.view.dialogs.yes_no; import android.app.Dialog; import android.os.Bundle; -import android.view.LayoutInflater; import android.view.View; import androidx.annotation.NonNull; @@ -39,7 +38,7 @@ public class DialogYesNoView extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - var binding = DialogYesNoBinding.inflate(LayoutInflater.from(requireContext())); + var binding = DialogYesNoBinding.inflate(getLayoutInflater()); binding.executePendingBindings(); if (UtilityString.isNullOrEmpty(title)) { diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d2a7e179..dfb2c2d9 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -458,8 +458,10 @@ Stampa etichetta lavorazione Impostazioni scanner Svilupppo - Esporta log - Esporta il log degli eventi + Esporta log + Esporta il log degli eventi + Aggiornamenti beta + Abilita aggiornamenti beta (fortemente sconsigliato) Ritardo scansione Imposta un ritardo di lettura per la scansione Modalità scansione diff --git a/app/src/main/res/values/attr.xml b/app/src/main/res/values/attr.xml index a9e9cd76..318884eb 100644 --- a/app/src/main/res/values/attr.xml +++ b/app/src/main/res/values/attr.xml @@ -20,4 +20,10 @@ + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 79e3a5bb..e2cb2325 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -463,8 +463,10 @@ Print production label Scanner settings Developer settings - Esporta log - Esporta il log degli eventi + Export log + Export event log + Beta updates + Enable beta updates (strongly discouraged) Scan delay Set reading scanner delay Modalità scansione diff --git a/app/src/main/res/xml/app_preferences.xml b/app/src/main/res/xml/app_preferences.xml index fbf785a3..e67a9ef7 100644 --- a/app/src/main/res/xml/app_preferences.xml +++ b/app/src/main/res/xml/app_preferences.xml @@ -67,10 +67,20 @@ app:title="@string/developer_settings" app:iconSpaceReserved="false"> + + diff --git a/barcode_base_android_library/src/main/java/it/integry/barcode_base_android_library/model/BarcodeSetting.java b/barcode_base_android_library/src/main/java/it/integry/barcode_base_android_library/model/BarcodeSetting.java index 90de83c6..84b6eb09 100644 --- a/barcode_base_android_library/src/main/java/it/integry/barcode_base_android_library/model/BarcodeSetting.java +++ b/barcode_base_android_library/src/main/java/it/integry/barcode_base_android_library/model/BarcodeSetting.java @@ -1,7 +1,6 @@ package it.integry.barcode_base_android_library.model; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; public class BarcodeSetting { @@ -13,14 +12,13 @@ public class BarcodeSetting { public static final String P_TRIGGER_SCAN_DELAY = "TRIG_SCAN_DELAY"; - public static CharSequence[] getTriggerScanModes() { - List keys = new ArrayList<>(); - keys.add(V_TRIGGER_SCAN_MODE_READ_ON_RELEASE); - keys.add(V_TRIGGER_SCAN_MODE_ONE_SHOT); -// keys.add(V_TRIGGER_SCAN_MODE_CONTINUOS); -// keys.add(V_TRIGGER_SCAN_MODE_READ_ON_SECOND_TRIGGER_PRESS); - - return keys.toArray(new String[0]); + public static HashMap getTriggerScanModes() { + return new HashMap<>() {{ + put(V_TRIGGER_SCAN_MODE_READ_ON_RELEASE, "Read on release"); + put(V_TRIGGER_SCAN_MODE_ONE_SHOT, "One shot"); +// put(V_TRIGGER_SCAN_MODE_CONTINUOS, "Continuous"); +// put(V_TRIGGER_SCAN_MODE_READ_ON_SECOND_TRIGGER_PRESS, "Read on second trigger press"); + }}; } }