Aggiunta impostazione che permette di abilitare la ricezione degli aggiornamenti beta

This commit is contained in:
Giuseppe Scorrano 2025-02-25 16:52:09 +01:00
parent 93b18531ab
commit d3b7cd8cd6
11 changed files with 140 additions and 68 deletions

View File

@ -238,8 +238,8 @@ public class MainApplicationModule {
@Provides @Provides
@Singleton @Singleton
SystemRESTConsumer provideSystemRESTConsumer(RESTBuilder restBuilder) { SystemRESTConsumer provideSystemRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder) {
return new SystemRESTConsumer(restBuilder); return new SystemRESTConsumer(executorService, restBuilder);
} }
@Provides @Provides

View File

@ -13,6 +13,7 @@ import java.io.InputStreamReader;
import java.io.Reader; import java.io.Reader;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -36,9 +37,11 @@ import retrofit2.Response;
@Singleton @Singleton
public class SystemRESTConsumer extends _BaseRESTConsumer { public class SystemRESTConsumer extends _BaseRESTConsumer {
private final ExecutorService executorService;
private final RESTBuilder restBuilder; private final RESTBuilder restBuilder;
public SystemRESTConsumer(RESTBuilder restBuilder) { public SystemRESTConsumer(ExecutorService executorService, RESTBuilder restBuilder) {
this.executorService = executorService;
this.restBuilder = restBuilder; this.restBuilder = restBuilder;
} }
@ -161,20 +164,19 @@ public class SystemRESTConsumer extends _BaseRESTConsumer {
} }
public void sendMail(MailRequestDTO mailDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) { public void sendMailSynchronized(MailRequestDTO mailDTO) throws Exception {
SystemRESTConsumerService service = restBuilder.getService(SystemRESTConsumerService.class); SystemRESTConsumerService service = restBuilder.getService(SystemRESTConsumerService.class);
service.sendMail(mailDTO).enqueue(new ManagedErrorCallback<>() { var response = service.sendMail(mailDTO).execute();
@Override analyzeAnswer(response, "sendMail");
public void onResponse(Call<ServiceRESTResponse<String>> call, Response<ServiceRESTResponse<String>> response) { }
if (onComplete != null) onComplete.run();
}
@Override public void sendMail(MailRequestDTO mailDTO, Runnable onComplete, RunnableArgs<Exception> onFailed) {
public void onFailure(Call<ServiceRESTResponse<String>> call, @NonNull final Exception e) { executorService.execute(() -> {
if (onFailed != null) { try {
onFailed.run(e); sendMailSynchronized(mailDTO);
} if (onComplete != null) onComplete.run();
} catch (Exception ex) {
if (onFailed != null) onFailed.run(ex);
} }
}); });
} }

View File

@ -32,6 +32,6 @@ public interface SystemRESTConsumerService {
Call<ServiceRESTResponse<List<AvailableCodMdepsDTO>>> getAvailableCodMdeps(); Call<ServiceRESTResponse<List<AvailableCodMdepsDTO>>> getAvailableCodMdeps();
@POST("sendEmail") @POST("sendEmail")
Call<ServiceRESTResponse<String>> sendMail(@Body MailRequestDTO mailDto); Call<ServiceRESTResponse<Void>> sendMail(@Body MailRequestDTO mailDto);
} }

View File

@ -3,8 +3,8 @@ package it.integry.integrywmsnative.gest.settings;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html; import android.os.Handler;
import android.text.SpannableString; import android.os.Looper;
import android.util.Base64; import android.util.Base64;
import android.widget.Toast; import android.widget.Toast;
@ -31,6 +31,7 @@ import java.util.Collection;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import javax.inject.Inject; 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.rest.model.MailRequestDTO;
import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.core.utility.UtilityResources; 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.DialogProgressView;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView;
import it.integry.integrywmsnative.view.dialogs.yes_no.DialogYesNoView; import it.integry.integrywmsnative.view.dialogs.yes_no.DialogYesNoView;
public class MainSettingsFragment extends PreferenceFragmentCompat implements ITitledFragment, Preference.OnPreferenceChangeListener { 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); var triggerScanModeListPref = (ListPreference) findPreference(KEY_TRIGGER_SCAN_MODE);
if (triggerScanModeListPref != null) { if (triggerScanModeListPref != null) {
var scanModes = BarcodeSetting.getTriggerScanModes(); 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); triggerScanModeListPref.setOnPreferenceChangeListener(this);
} }
} }
@ -150,15 +155,15 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
if (!btPairedDevices.isEmpty()) { if (!btPairedDevices.isEmpty()) {
CharSequence[] entries = new CharSequence[btPairedDevices.size()]; CharSequence[] entries = new CharSequence[btPairedDevices.size()];
Stream.of(btPairedDevices) btPairedDevices.stream()
.map(BluetoothDevice::getName) .map(BluetoothDevice::getName)
.toList() .collect(Collectors.toList())
.toArray(entries); .toArray(entries);
CharSequence[] entryValues = new CharSequence[btPairedDevices.size()]; CharSequence[] entryValues = new CharSequence[btPairedDevices.size()];
Stream.of(btPairedDevices) btPairedDevices.stream()
.map(BluetoothDevice::getAddress) .map(BluetoothDevice::getAddress)
.toList() .collect(Collectors.toList())
.toArray(entryValues); .toArray(entryValues);
lp.setEntries(entries); lp.setEntries(entries);
@ -230,7 +235,12 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
private void exportLog() { private void exportLog() {
var handler = new Handler(Looper.getMainLooper());
DialogYesNoView.newInstance("Esportazione log", "Vuoi inviare il log degli eventi al supporto?", result -> { 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(); this.openProgress();
executorService.execute(() -> { executorService.execute(() -> {
@ -246,7 +256,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
try { try {
List<MailAttachmentDTO> attachmentDTOList = new ArrayList<>(); List<MailAttachmentDTO> attachmentDTOList = new ArrayList<>();
if(fileToShare != null) { if (fileToShare != null) {
var htmlContent = createAppLogAttachment(fileToShare); var htmlContent = createAppLogAttachment(fileToShare);
byte[] buffer = htmlContent.getBytes();//specify the size to allow. 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[1] = requireContext().getDatabasePath("integry_wms-shm");
dbFiles[2] = requireContext().getDatabasePath("integry_wms-wal"); 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()]; byte[] dbFileBytes = new byte[(int) dbFiles[i].length()];
FileInputStream inputStream = new FileInputStream(dbFiles[i]); FileInputStream inputStream = new FileInputStream(dbFiles[i]);
final int read = inputStream.read(dbFileBytes); final int read = inputStream.read(dbFileBytes);
@ -284,25 +294,14 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
.setAttachments(attachmentDTOList); .setAttachments(attachmentDTOList);
systemRESTConsumer.sendMail(mailRequest, this::closeProgress, ex -> { systemRESTConsumer.sendMailSynchronized(mailRequest);
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();
// requireActivity().runOnUiThread(() -> { this.closeProgress();
// DialogSimpleMessageView } catch (Exception ex) {
// .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) handler.post(() -> {
// .show(requireActivity().getSupportFragmentManager(), "tag"); this.closeProgress();
// }); UtilityExceptions.defaultException(requireContext(), ex);
// });
// FirebaseCrashlytics.getInstance().recordException(ex);
} }
}); });
}) })
@ -310,16 +309,15 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
} }
private void openProgress() { private void openProgress() {
// executorService.execute(() -> { // executorService.execute(() -> {
this.mCurrentProgress.show(requireActivity().getSupportFragmentManager()); this.mCurrentProgress.show(requireActivity().getSupportFragmentManager());
// }); // });
} }
private void closeProgress() { private void closeProgress() {
// executorService.execute(() -> { // executorService.execute(() -> {
mCurrentProgress.dismiss(); mCurrentProgress.dismiss();
// }); // });
} }
@ -334,7 +332,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
while ((line = br.readLine()) != null) { while ((line = br.readLine()) != null) {
if(!line.matches("\\d{13}.*")) { if (!line.matches("\\d{13}.*")) {
int lastNewLineChar = text.lastIndexOf("\n"); int lastNewLineChar = text.lastIndexOf("\n");
text.deleteCharAt(text.length() - 1); text.deleteCharAt(text.length() - 1);
} }
@ -411,7 +409,7 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
} }
htmlContent.append(""" htmlContent.append("""
<script type="text/javascript"> <script type="text/javascript">
document.querySelectorAll(".message").forEach(el => el.innerHTML = el.innerHTML.replaceAll(/at it\\.integry.*?(?:<br>)/g, '<b>$&</b>')); document.querySelectorAll(".message").forEach(el => el.innerHTML = el.innerHTML.replaceAll(/at it\\.integry.*?(?:<br>)/g, '<b>$&</b>'));
</script> </script>

View File

@ -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");
}
}

View File

@ -2,7 +2,6 @@ package it.integry.integrywmsnative.view.dialogs.yes_no;
import android.app.Dialog; import android.app.Dialog;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -39,7 +38,7 @@ public class DialogYesNoView extends DialogFragment {
@NonNull @NonNull
@Override @Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
var binding = DialogYesNoBinding.inflate(LayoutInflater.from(requireContext())); var binding = DialogYesNoBinding.inflate(getLayoutInflater());
binding.executePendingBindings(); binding.executePendingBindings();
if (UtilityString.isNullOrEmpty(title)) { if (UtilityString.isNullOrEmpty(title)) {

View File

@ -458,8 +458,10 @@
<string name="action_print_production_SSCC">Stampa etichetta lavorazione</string> <string name="action_print_production_SSCC">Stampa etichetta lavorazione</string>
<string name="scanner_settings">Impostazioni scanner</string> <string name="scanner_settings">Impostazioni scanner</string>
<string name="developer_settings">Svilupppo</string> <string name="developer_settings">Svilupppo</string>
<string name="developer_settings_title">Esporta log</string> <string name="developer_settings_export_log_title">Esporta log</string>
<string name="developer_settings_summary">Esporta il log degli eventi</string> <string name="developer_settings_export_log_summary">Esporta il log degli eventi</string>
<string name="developer_settings_enable_beta_version_title">Aggiornamenti beta</string>
<string name="developer_settings_enable_beta_version_summary">Abilita aggiornamenti beta (fortemente sconsigliato)</string>
<string name="scanner_settings_scanner_delay_title">Ritardo scansione</string> <string name="scanner_settings_scanner_delay_title">Ritardo scansione</string>
<string name="scanner_settings_scanner_delay_summary">Imposta un ritardo di lettura per la scansione</string> <string name="scanner_settings_scanner_delay_summary">Imposta un ritardo di lettura per la scansione</string>
<string name="scanner_settings_trigger_scan_mode_title">Modalità scansione</string> <string name="scanner_settings_trigger_scan_mode_title">Modalità scansione</string>

View File

@ -20,4 +20,10 @@
<attr name="backgroundView" /> <attr name="backgroundView" />
<attr name="parentView" /> <attr name="parentView" />
</declare-styleable> </declare-styleable>
<declare-styleable name="ConfirmSwitchPreferenceCompat">
<attr name="confirmTitle" format="string" />
<attr name="confirmMessage" format="string" />
</declare-styleable>
</resources> </resources>

View File

@ -463,8 +463,10 @@
<string name="action_print_production_SSCC">Print production label</string> <string name="action_print_production_SSCC">Print production label</string>
<string name="scanner_settings">Scanner settings</string> <string name="scanner_settings">Scanner settings</string>
<string name="developer_settings">Developer settings</string> <string name="developer_settings">Developer settings</string>
<string name="developer_settings_title">Esporta log</string> <string name="developer_settings_export_log_title">Export log</string>
<string name="developer_settings_summary">Esporta il log degli eventi</string> <string name="developer_settings_export_log_summary">Export event log</string>
<string name="developer_settings_enable_beta_version_title">Beta updates</string>
<string name="developer_settings_enable_beta_version_summary">Enable beta updates (strongly discouraged)</string>
<string name="scanner_settings_scanner_delay_title">Scan delay</string> <string name="scanner_settings_scanner_delay_title">Scan delay</string>
<string name="scanner_settings_scanner_delay_summary">Set reading scanner delay</string> <string name="scanner_settings_scanner_delay_summary">Set reading scanner delay</string>
<string name="scanner_settings_trigger_scan_mode_title">Modalità scansione</string> <string name="scanner_settings_trigger_scan_mode_title">Modalità scansione</string>

View File

@ -67,10 +67,20 @@
app:title="@string/developer_settings" app:title="@string/developer_settings"
app:iconSpaceReserved="false"> app:iconSpaceReserved="false">
<it.integry.integrywmsnative.view.components.ConfirmSwitchPreferenceCompat
android:title="@string/developer_settings_enable_beta_version_title"
android:key="ENABLE_BETA"
android:summary="@string/developer_settings_enable_beta_version_summary"
app:iconSpaceReserved="false"
android:defaultValue="false"
app:confirmTitle="@string/developer_settings_enable_beta_version_title"
app:confirmMessage="Sei sicuro di voler abilitare gli aggiornamenti beta? Se accetti dovrai chiudere e riaprire l'app per scaricare l'aggiornamento."
/>
<Preference <Preference
android:title="@string/developer_settings_title" android:title="@string/developer_settings_export_log_title"
android:key="EXPORT_LOG" android:key="EXPORT_LOG"
android:summary="@string/developer_settings_summary" android:summary="@string/developer_settings_export_log_summary"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
/> />

View File

@ -1,7 +1,6 @@
package it.integry.barcode_base_android_library.model; package it.integry.barcode_base_android_library.model;
import java.util.ArrayList; import java.util.HashMap;
import java.util.List;
public class BarcodeSetting { public class BarcodeSetting {
@ -13,14 +12,13 @@ public class BarcodeSetting {
public static final String P_TRIGGER_SCAN_DELAY = "TRIG_SCAN_DELAY"; public static final String P_TRIGGER_SCAN_DELAY = "TRIG_SCAN_DELAY";
public static CharSequence[] getTriggerScanModes() { public static HashMap<String, CharSequence> getTriggerScanModes() {
List<String> keys = new ArrayList<>(); return new HashMap<>() {{
keys.add(V_TRIGGER_SCAN_MODE_READ_ON_RELEASE); put(V_TRIGGER_SCAN_MODE_READ_ON_RELEASE, "Read on release");
keys.add(V_TRIGGER_SCAN_MODE_ONE_SHOT); put(V_TRIGGER_SCAN_MODE_ONE_SHOT, "One shot");
// keys.add(V_TRIGGER_SCAN_MODE_CONTINUOS); // put(V_TRIGGER_SCAN_MODE_CONTINUOS, "Continuous");
// keys.add(V_TRIGGER_SCAN_MODE_READ_ON_SECOND_TRIGGER_PRESS); // put(V_TRIGGER_SCAN_MODE_READ_ON_SECOND_TRIGGER_PRESS, "Read on second trigger press");
}};
return keys.toArray(new String[0]);
} }
} }