Finish Release-1

This commit is contained in:
Giuseppe Scorrano 2025-02-26 10:25:29 +01:00
commit 7f468e19bd
16 changed files with 286 additions and 139 deletions

View File

@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services'
android { android {
def appVersionCode = 473 def appVersionCode = 474
def appVersionName = '1.44.04' def appVersionName = '1.44.05'
signingConfigs { signingConfigs {
release { release {

View File

@ -132,8 +132,8 @@ public class MainApplicationModule {
@Provides @Provides
@Singleton @Singleton
UpdatesManager provideUpdatesManager() { UpdatesManager provideUpdatesManager(ExecutorService executorService, Handler handler, SystemRESTConsumer systemRESTConsumer) {
return new UpdatesManager(); return new UpdatesManager(executorService, handler, systemRESTConsumer);
} }
@Provides @Provides
@ -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

@ -0,0 +1,26 @@
package it.integry.integrywmsnative.core.helper;
import android.content.Context;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import it.integry.integrywmsnative.core.utility.UtilityContext;
public final class ContextHelper {
public static FragmentManager getFragmentManagerFromContext(Context context) {
if (context == null) {
throw new IllegalArgumentException("Context cannot be null");
}
if (context instanceof FragmentActivity) {
return ((FragmentActivity) context).getSupportFragmentManager();
} else if (UtilityContext.getMainActivity() != null) {
return UtilityContext.getMainActivity().getSupportFragmentManager();
}
return null;
}
}

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,31 +37,24 @@ 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;
} }
public void retrieveUpdatesInfo(final RunnableArgs<LatestAppVersionInfoDTO> onSuccess, final RunnableArgs<Exception> onFailed) { public LatestAppVersionInfoDTO retrieveUpdatesInfoSynchronized(boolean betaVersion) throws Exception {
SystemRESTConsumerService systemRESTConsumerService = restBuilder.getService(SystemRESTConsumerService.class); SystemRESTConsumerService systemRESTConsumerService = restBuilder.getService(SystemRESTConsumerService.class);
systemRESTConsumerService.retrieveUpdatesInfo() var response = systemRESTConsumerService.retrieveUpdatesInfo(betaVersion ? "beta" : null)
.enqueue(new ManagedErrorCallback<>() { .execute();
@Override
public void onResponse(Call<LatestAppVersionInfoDTO> call, Response<LatestAppVersionInfoDTO> response) {
if (response.code() == 404) { if (response.code() == 404) {
onSuccess.run(null); return null;
return;
} }
analyzeAnswerGeneric(response, "updates", onSuccess, onFailed); return analyzeAnswerGeneric(response, "updates");
}
@Override
public void onFailure(Call<LatestAppVersionInfoDTO> call, @NonNull final Exception e) {
onFailed.run(e);
}
});
} }
@ -161,20 +155,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

@ -17,7 +17,7 @@ import retrofit2.http.Query;
public interface SystemRESTConsumerService { public interface SystemRESTConsumerService {
@GET("wms/currentVersion") @GET("wms/currentVersion")
Call<LatestAppVersionInfoDTO> retrieveUpdatesInfo(); Call<LatestAppVersionInfoDTO> retrieveUpdatesInfo(@Query("suffix") String suffix);
@POST("device/register") @POST("device/register")
Call<ServiceRESTResponse<Void>> registerDevice(@Body RegisterDeviceRequestDTO registerDeviceRequestDTO); Call<ServiceRESTResponse<Void>> registerDevice(@Body RegisterDeviceRequestDTO registerDeviceRequestDTO);
@ -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

@ -1,83 +1,117 @@
package it.integry.integrywmsnative.core.update; package it.integry.integrywmsnative.core.update;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Environment; import android.os.Environment;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceManager;
import java.io.File; import java.io.File;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import javax.inject.Singleton; import javax.inject.Singleton;
import it.integry.integrywmsnative.BuildConfig; import it.integry.integrywmsnative.BuildConfig;
import it.integry.integrywmsnative.core.helper.ContextHelper;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.system.LatestAppVersionInfoDTO; import it.integry.integrywmsnative.core.rest.model.system.LatestAppVersionInfoDTO;
import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.FileDownloader; import it.integry.integrywmsnative.core.utility.FileDownloader;
import it.integry.integrywmsnative.core.utility.UtilityExceptions; import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.gest.settings.MainSettingsFragment;
import it.integry.integrywmsnative.view.dialogs.DialogProgressView; import it.integry.integrywmsnative.view.dialogs.DialogProgressView;
import it.integry.integrywmsnative.view.dialogs.update_available.DialogUpdateAvailableView; import it.integry.integrywmsnative.view.dialogs.update_available.DialogUpdateAvailableView;
@Singleton @Singleton
public class UpdatesManager { public class UpdatesManager {
private final ExecutorService executorService;
private final Handler handler;
private final SystemRESTConsumer systemRESTConsumer;
private AppCompatActivity mContext; public UpdatesManager(ExecutorService executorService, Handler handler, SystemRESTConsumer systemRESTConsumer) {
this.executorService = executorService;
this.handler = handler;
this.systemRESTConsumer = systemRESTConsumer;
}
public void init(AppCompatActivity activityContext, SystemRESTConsumer systemRESTConsumer) { public void executeCheck(Context context, boolean forceReinstall) {
this.mContext = activityContext;
executorService.execute(() -> {
try {
final String baseEndpoint = SettingsManager.i().getServer().getProtocol() + "://" + SettingsManager.i().getServer().getHost() + final String baseEndpoint = SettingsManager.i().getServer().getProtocol() + "://" + SettingsManager.i().getServer().getHost() +
(SettingsManager.i().getServer().getPort() > 0 ? ":" + SettingsManager.i().getServer().getPort() : ""); (SettingsManager.i().getServer().getPort() > 0 ? ":" + SettingsManager.i().getServer().getPort() : "");
final String currentVersionUrl = baseEndpoint + "/ems-api/wms/currentVersion"; SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
final String currentDownloadUrl = baseEndpoint + "/ems-api/wms/android-release.apk"; var betaEnabled = sharedPreferences.getBoolean(MainSettingsFragment.KEY_BUTTON_ENABLE_BETA, false);
LatestAppVersionInfoDTO latestData = systemRESTConsumer.retrieveUpdatesInfoSynchronized(betaEnabled);
systemRESTConsumer.retrieveUpdatesInfo(latestData -> {
if (latestData == null) if (latestData == null)
return; return;
if(latestData.getLatestVersionCode() <= BuildConfig.VERSION_CODE) if (latestData.getLatestVersionCode() < BuildConfig.VERSION_CODE)
return; return;
showDialog(latestData, () -> { boolean currentVersionIsBeta = BuildConfig.VERSION_NAME.contains("beta");
installAPK(currentDownloadUrl);
if(!forceReinstall && currentVersionIsBeta == betaEnabled && latestData.getLatestVersionCode() == BuildConfig.VERSION_CODE)
return;
//Se sto passando da una beta a una stable e viceversa non obbligo l'utente a fare l'aggiornamento
if(currentVersionIsBeta != betaEnabled || forceReinstall) {
latestData.setForced(false);
}
String currentDownloadUrl = baseEndpoint + latestData.getUrl();
showDialog(context, latestData, () -> {
installAPK(context, currentDownloadUrl);
});
} catch (Exception e) {
handler.post(() -> {
UtilityExceptions.defaultException(context, e);
});
}
}); });
}, ex -> UtilityExceptions.defaultException(mContext, ex));
} }
private void showDialog(LatestAppVersionInfoDTO updatesData, Runnable onUpdateStart) { private void showDialog(Context context, LatestAppVersionInfoDTO updatesData, Runnable onUpdateStart) {
DialogUpdateAvailableView.newInstance(updatesData, onUpdateStart) DialogUpdateAvailableView.newInstance(updatesData, onUpdateStart)
.show(mContext.getSupportFragmentManager(), "dialog-updates"); .show(((FragmentActivity)context).getSupportFragmentManager(), "dialog-updates");
} }
private void installAPK(String downloadURL) { private void installAPK(Context context, String downloadURL) {
File destination = mContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); File destination = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
var progressDialogBuilder = new DialogProgressView("Download", null, false); var progressDialogBuilder = new DialogProgressView("Download", null, false);
progressDialogBuilder.show(mContext.getSupportFragmentManager(), "tag"); progressDialogBuilder.show(Objects.requireNonNull(ContextHelper.getFragmentManagerFromContext(context)), "tag");
var fileDownloader = new FileDownloader() var fileDownloader = new FileDownloader()
.setDestFolder(destination) .setDestFolder(destination)
.setUrlString(downloadURL) .setUrlString(downloadURL)
.setOnProgressUpdate(progress -> { .setOnProgressUpdate(progress -> {
mContext.runOnUiThread(() -> { handler.post(() -> {
progressDialogBuilder.setProgress(progress); progressDialogBuilder.setProgress(progress);
}); });
}) })
.setOnDownloadCompleted(destPath -> { .setOnDownloadCompleted(destPath -> {
mContext.runOnUiThread(() -> { handler.post(() -> {
progressDialogBuilder.dismiss(); progressDialogBuilder.dismiss();
if (!destination.exists()) { if (!destination.exists()) {
UtilityExceptions.defaultException(mContext, new Exception("Errore durante il download dell'aggiornamento")); UtilityExceptions.defaultException(context, new Exception("Errore durante il download dell'aggiornamento"));
return; return;
} }
@ -86,8 +120,8 @@ public class UpdatesManager {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
fileLoc = GenericFileProvider.getUriForFile(mContext, fileLoc = GenericFileProvider.getUriForFile(context,
mContext.getApplicationContext().getPackageName() + ".core.update.GenericFileProvider", context.getApplicationContext().getPackageName() + ".core.update.GenericFileProvider",
destPath); destPath);
} else { } else {
intent = new Intent(Intent.ACTION_VIEW); intent = new Intent(Intent.ACTION_VIEW);
@ -97,19 +131,19 @@ public class UpdatesManager {
intent.setDataAndType(fileLoc, "application/vnd.android.package-archive"); intent.setDataAndType(fileLoc, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
mContext.startActivity(intent); context.startActivity(intent);
}); });
}); });
new Thread(() -> { executorService.execute(() -> {
try { try {
fileDownloader.download(); fileDownloader.download();
} catch (Exception e) { } catch (Exception e) {
progressDialogBuilder.dismissAllowingStateLoss(); progressDialogBuilder.dismissAllowingStateLoss();
UtilityExceptions.defaultException(mContext, e); UtilityExceptions.defaultException(context, e);
} }
}).start(); });
} }
} }

View File

@ -3,7 +3,6 @@ package it.integry.integrywmsnative.core.utility;
import android.content.Context; import android.content.Context;
import android.text.Html; import android.text.Html;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
@ -14,6 +13,7 @@ import it.integry.integrywmsnative.BuildConfig;
import it.integry.integrywmsnative.core.exception.InvalidConnectionException; import it.integry.integrywmsnative.core.exception.InvalidConnectionException;
import it.integry.integrywmsnative.core.exception.InvalidLUException; import it.integry.integrywmsnative.core.exception.InvalidLUException;
import it.integry.integrywmsnative.core.exception.InvalidLUGestioneException; import it.integry.integrywmsnative.core.exception.InvalidLUGestioneException;
import it.integry.integrywmsnative.core.helper.ContextHelper;
import it.integry.integrywmsnative.core.rest.CommonRESTException; import it.integry.integrywmsnative.core.rest.CommonRESTException;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView; import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView;
@ -44,13 +44,7 @@ public class UtilityExceptions {
if (ex.getCause() != null) errorMessage += "<br />" + ex.getCause().getMessage(); if (ex.getCause() != null) errorMessage += "<br />" + ex.getCause().getMessage();
} }
FragmentManager fm = null; FragmentManager fm = ContextHelper.getFragmentManagerFromContext(context);
if (context instanceof FragmentActivity) {
fm = ((FragmentActivity) context).getSupportFragmentManager();
} else if (UtilityContext.getMainActivity() != null) {
fm = UtilityContext.getMainActivity().getSupportFragmentManager();
}
if (fm != null) { if (fm != null) {
DialogSimpleMessageView.makeErrorDialog(Html.fromHtml(errorMessage), null, null) DialogSimpleMessageView.makeErrorDialog(Html.fromHtml(errorMessage), null, null)

View File

@ -89,7 +89,7 @@ public class MainActivity extends BaseActivity
mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false); mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false);
setContentView(mBinding.getRoot()); setContentView(mBinding.getRoot());
updatesManager.init(this, systemRESTConsumer); updatesManager.executeCheck(this, false);
UtilityContext.initMainActivity(this); UtilityContext.initMainActivity(this);
setSupportActionBar(mBinding.appBarMain.toolbar); setSupportActionBar(mBinding.appBarMain.toolbar);

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;
@ -18,6 +18,7 @@ import androidx.preference.PreferenceFragmentCompat;
import androidx.sqlite.db.SimpleSQLiteQuery; import androidx.sqlite.db.SimpleSQLiteQuery;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import com.google.android.material.snackbar.Snackbar;
import com.harrysoft.androidbluetoothserial.BluetoothManager; import com.harrysoft.androidbluetoothserial.BluetoothManager;
import java.io.BufferedReader; import java.io.BufferedReader;
@ -31,6 +32,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;
@ -44,10 +46,11 @@ import it.integry.integrywmsnative.core.interfaces.ITitledFragment;
import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.MailAttachmentDTO; 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.update.UpdatesManager;
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 {
@ -67,6 +70,9 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
@Inject @Inject
public ExecutorService executorService; public ExecutorService executorService;
@Inject
public UpdatesManager updatesManager;
private boolean progressOpened; private boolean progressOpened;
@ -75,6 +81,8 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
public static final String KEY_PALLET_BT_DEVICE = "pallet_scale_bt_device"; public static final String KEY_PALLET_BT_DEVICE = "pallet_scale_bt_device";
public static final String KEY_TRIGGER_SCAN_MODE = "TRIG_SCAN_MODE"; public static final String KEY_TRIGGER_SCAN_MODE = "TRIG_SCAN_MODE";
public static final String KEY_TRIGGER_SCAN_DELAY = "TRIG_SCAN_DELAY"; public static final String KEY_TRIGGER_SCAN_DELAY = "TRIG_SCAN_DELAY";
public static final String KEY_BUTTON_ENABLE_BETA = "ENABLE_BETA";
public static final String KEY_BUTTON_CHECK_UPDATES = "CHECK_UPDATES";
public static final String KEY_BUTTON_EXPORT_LOG = "EXPORT_LOG"; public static final String KEY_BUTTON_EXPORT_LOG = "EXPORT_LOG";
private Collection<BluetoothDevice> btPairedDevices; private Collection<BluetoothDevice> btPairedDevices;
@ -113,8 +121,14 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
triggerScanModeListPref.setOnPreferenceChangeListener(this); triggerScanModeListPref.setOnPreferenceChangeListener(this);
triggerScanModeListPref.setSummary(triggerScanModeListPref.getValue()); triggerScanModeListPref.setSummary(triggerScanModeListPref.getValue());
Preference button = findPreference(KEY_BUTTON_EXPORT_LOG); Preference checkUpdatesButton = findPreference(KEY_BUTTON_CHECK_UPDATES);
button.setOnPreferenceClickListener(preference -> { checkUpdatesButton.setOnPreferenceClickListener(preference -> {
checkUpdates();
return true;
});
Preference exportLogButton = findPreference(KEY_BUTTON_EXPORT_LOG);
exportLogButton.setOnPreferenceClickListener(preference -> {
exportLog(); exportLog();
return true; return true;
}); });
@ -126,8 +140,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 +168,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);
@ -228,9 +246,20 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT
listPref.setSummary(btDeviceName); listPref.setSummary(btDeviceName);
} }
private void checkUpdates() {
Snackbar.make(getView(), R.string.checking_updates, Snackbar.LENGTH_SHORT)
.show();
updatesManager.executeCheck(getContext(), true);
}
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(() -> {
@ -284,25 +313,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,7 +328,6 @@ 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());

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

@ -190,6 +190,8 @@
<string name="tare_pckg">Tara collo</string> <string name="tare_pckg">Tara collo</string>
<string name="tare_art">Tara articolo</string> <string name="tare_art">Tara articolo</string>
<string name="checking_updates">Controllo gli aggiornamenti</string>
<string name="saving">Salvataggio</string> <string name="saving">Salvataggio</string>
<string name="data_saved">Salvataggio completato</string> <string name="data_saved">Salvataggio completato</string>
<string name="alert_print_completed_message">Stampa completata</string> <string name="alert_print_completed_message">Stampa completata</string>
@ -458,8 +460,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

@ -189,6 +189,8 @@
<string name="tare_art">Tare product</string> <string name="tare_art">Tare product</string>
<string name="tare_pckg">Tare pckg</string> <string name="tare_pckg">Tare pckg</string>
<string name="checking_updates">Checking for updates</string>
<string name="saving">Saving</string> <string name="saving">Saving</string>
<string name="data_saved">Data saved</string> <string name="data_saved">Data saved</string>
<string name="alert_print_completed_message">Printing job completed</string> <string name="alert_print_completed_message">Printing job completed</string>
@ -463,8 +465,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,27 @@
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="Verifica aggiornamenti"
android:key="CHECK_UPDATES"
android:summary="Verifica la disponibilità di nuovi aggiornamenti"
app:iconSpaceReserved="false"
/>
<Preference
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]);
} }
} }