diff --git a/app/build.gradle b/app/build.gradle index 22f67ae6..35143a55 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 473 - def appVersionName = '1.44.04' + def appVersionCode = 474 + def appVersionName = '1.44.05' signingConfigs { release { diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java index 52eb0626..8d774307 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationModule.java @@ -132,8 +132,8 @@ public class MainApplicationModule { @Provides @Singleton - UpdatesManager provideUpdatesManager() { - return new UpdatesManager(); + UpdatesManager provideUpdatesManager(ExecutorService executorService, Handler handler, SystemRESTConsumer systemRESTConsumer) { + return new UpdatesManager(executorService, handler, systemRESTConsumer); } @Provides @@ -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/helper/ContextHelper.java b/app/src/main/java/it/integry/integrywmsnative/core/helper/ContextHelper.java new file mode 100644 index 00000000..c6c76519 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/helper/ContextHelper.java @@ -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; + } + +} 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..5bcf2c54 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,31 +37,24 @@ 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; } - public void retrieveUpdatesInfo(final RunnableArgs onSuccess, final RunnableArgs onFailed) { + public LatestAppVersionInfoDTO retrieveUpdatesInfoSynchronized(boolean betaVersion) throws Exception { SystemRESTConsumerService systemRESTConsumerService = restBuilder.getService(SystemRESTConsumerService.class); - systemRESTConsumerService.retrieveUpdatesInfo() - .enqueue(new ManagedErrorCallback<>() { - @Override - public void onResponse(Call call, Response response) { - if(response.code() == 404) { - onSuccess.run(null); - return; - } + var response = systemRESTConsumerService.retrieveUpdatesInfo(betaVersion ? "beta" : null) + .execute(); - analyzeAnswerGeneric(response, "updates", onSuccess, onFailed); - } + if (response.code() == 404) { + return null; + } - @Override - public void onFailure(Call call, @NonNull final Exception e) { - onFailed.run(e); - } - }); + return analyzeAnswerGeneric(response, "updates"); } @@ -161,20 +155,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..97e88112 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 @@ -17,7 +17,7 @@ import retrofit2.http.Query; public interface SystemRESTConsumerService { @GET("wms/currentVersion") - Call retrieveUpdatesInfo(); + Call retrieveUpdatesInfo(@Query("suffix") String suffix); @POST("device/register") Call> registerDevice(@Body RegisterDeviceRequestDTO registerDeviceRequestDTO); @@ -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/core/update/UpdatesManager.java b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java index 00bc43a7..35f35636 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/update/UpdatesManager.java @@ -1,83 +1,117 @@ package it.integry.integrywmsnative.core.update; +import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; 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.util.Objects; +import java.util.concurrent.ExecutorService; import javax.inject.Singleton; 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.model.system.LatestAppVersionInfoDTO; import it.integry.integrywmsnative.core.settings.SettingsManager; import it.integry.integrywmsnative.core.utility.FileDownloader; 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.update_available.DialogUpdateAvailableView; @Singleton public class UpdatesManager { + private final ExecutorService executorService; + private final Handler handler; + private final SystemRESTConsumer systemRESTConsumer; - private AppCompatActivity mContext; - - public void init(AppCompatActivity activityContext, SystemRESTConsumer systemRESTConsumer) { - this.mContext = activityContext; - - final String baseEndpoint = SettingsManager.i().getServer().getProtocol() + "://" + SettingsManager.i().getServer().getHost() + - (SettingsManager.i().getServer().getPort() > 0 ? ":" + SettingsManager.i().getServer().getPort() : ""); - - final String currentVersionUrl = baseEndpoint + "/ems-api/wms/currentVersion"; - final String currentDownloadUrl = baseEndpoint + "/ems-api/wms/android-release.apk"; - - - systemRESTConsumer.retrieveUpdatesInfo(latestData -> { - - if (latestData == null) - return; - - if(latestData.getLatestVersionCode() <= BuildConfig.VERSION_CODE) - return; - - showDialog(latestData, () -> { - installAPK(currentDownloadUrl); - }); - }, ex -> UtilityExceptions.defaultException(mContext, ex)); + public UpdatesManager(ExecutorService executorService, Handler handler, SystemRESTConsumer systemRESTConsumer) { + this.executorService = executorService; + this.handler = handler; + this.systemRESTConsumer = systemRESTConsumer; } - private void showDialog(LatestAppVersionInfoDTO updatesData, Runnable onUpdateStart) { + public void executeCheck(Context context, boolean forceReinstall) { + + executorService.execute(() -> { + + try { + final String baseEndpoint = SettingsManager.i().getServer().getProtocol() + "://" + SettingsManager.i().getServer().getHost() + + (SettingsManager.i().getServer().getPort() > 0 ? ":" + SettingsManager.i().getServer().getPort() : ""); + + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + var betaEnabled = sharedPreferences.getBoolean(MainSettingsFragment.KEY_BUTTON_ENABLE_BETA, false); + + LatestAppVersionInfoDTO latestData = systemRESTConsumer.retrieveUpdatesInfoSynchronized(betaEnabled); + + if (latestData == null) + return; + + if (latestData.getLatestVersionCode() < BuildConfig.VERSION_CODE) + return; + + boolean currentVersionIsBeta = BuildConfig.VERSION_NAME.contains("beta"); + + 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); + }); + } + }); + } + + private void showDialog(Context context, LatestAppVersionInfoDTO updatesData, Runnable 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); - progressDialogBuilder.show(mContext.getSupportFragmentManager(), "tag"); + progressDialogBuilder.show(Objects.requireNonNull(ContextHelper.getFragmentManagerFromContext(context)), "tag"); var fileDownloader = new FileDownloader() .setDestFolder(destination) .setUrlString(downloadURL) .setOnProgressUpdate(progress -> { - mContext.runOnUiThread(() -> { + handler.post(() -> { progressDialogBuilder.setProgress(progress); }); }) .setOnDownloadCompleted(destPath -> { - mContext.runOnUiThread(() -> { + handler.post(() -> { progressDialogBuilder.dismiss(); 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; } @@ -86,8 +120,8 @@ public class UpdatesManager { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); - fileLoc = GenericFileProvider.getUriForFile(mContext, - mContext.getApplicationContext().getPackageName() + ".core.update.GenericFileProvider", + fileLoc = GenericFileProvider.getUriForFile(context, + context.getApplicationContext().getPackageName() + ".core.update.GenericFileProvider", destPath); } else { intent = new Intent(Intent.ACTION_VIEW); @@ -97,19 +131,19 @@ public class UpdatesManager { 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); - mContext.startActivity(intent); + context.startActivity(intent); }); }); - new Thread(() -> { + executorService.execute(() -> { try { fileDownloader.download(); } catch (Exception e) { progressDialogBuilder.dismissAllowingStateLoss(); - UtilityExceptions.defaultException(mContext, e); + UtilityExceptions.defaultException(context, e); } - }).start(); + }); } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java index cfe305fa..7c9a097c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityExceptions.java @@ -3,7 +3,6 @@ package it.integry.integrywmsnative.core.utility; import android.content.Context; import android.text.Html; -import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; 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.InvalidLUException; 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.view.dialogs.base.DialogSimpleMessageView; @@ -44,13 +44,7 @@ public class UtilityExceptions { if (ex.getCause() != null) errorMessage += "
" + ex.getCause().getMessage(); } - FragmentManager fm = null; - - if (context instanceof FragmentActivity) { - fm = ((FragmentActivity) context).getSupportFragmentManager(); - } else if (UtilityContext.getMainActivity() != null) { - fm = UtilityContext.getMainActivity().getSupportFragmentManager(); - } + FragmentManager fm = ContextHelper.getFragmentManagerFromContext(context); if (fm != null) { DialogSimpleMessageView.makeErrorDialog(Html.fromHtml(errorMessage), null, null) diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java index 58603a94..a3d51bb5 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/main/MainActivity.java @@ -89,7 +89,7 @@ public class MainActivity extends BaseActivity mBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_main, null, false); setContentView(mBinding.getRoot()); - updatesManager.init(this, systemRESTConsumer); + updatesManager.executeCheck(this, false); UtilityContext.initMainActivity(this); setSupportActionBar(mBinding.appBarMain.toolbar); 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..09cb77c2 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; @@ -18,6 +18,7 @@ import androidx.preference.PreferenceFragmentCompat; import androidx.sqlite.db.SimpleSQLiteQuery; import com.annimon.stream.Stream; +import com.google.android.material.snackbar.Snackbar; import com.harrysoft.androidbluetoothserial.BluetoothManager; import java.io.BufferedReader; @@ -31,6 +32,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; @@ -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.model.MailAttachmentDTO; 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.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 { @@ -67,6 +70,9 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT @Inject public ExecutorService executorService; + @Inject + public UpdatesManager updatesManager; + 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_TRIGGER_SCAN_MODE = "TRIG_SCAN_MODE"; 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"; private Collection btPairedDevices; @@ -113,8 +121,14 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT triggerScanModeListPref.setOnPreferenceChangeListener(this); triggerScanModeListPref.setSummary(triggerScanModeListPref.getValue()); - Preference button = findPreference(KEY_BUTTON_EXPORT_LOG); - button.setOnPreferenceClickListener(preference -> { + Preference checkUpdatesButton = findPreference(KEY_BUTTON_CHECK_UPDATES); + checkUpdatesButton.setOnPreferenceClickListener(preference -> { + checkUpdates(); + return true; + }); + + Preference exportLogButton = findPreference(KEY_BUTTON_EXPORT_LOG); + exportLogButton.setOnPreferenceClickListener(preference -> { exportLog(); return true; }); @@ -126,8 +140,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 +168,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); @@ -228,9 +246,20 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT listPref.setSummary(btDeviceName); } + private void checkUpdates() { + Snackbar.make(getView(), R.string.checking_updates, Snackbar.LENGTH_SHORT) + .show(); + updatesManager.executeCheck(getContext(), true); + } + 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 +275,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 +294,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 +313,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 +328,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 +351,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 +428,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..b4112f6a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -190,6 +190,8 @@ Tara collo Tara articolo + Controllo gli aggiornamenti + Salvataggio Salvataggio completato Stampa completata @@ -458,8 +460,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..f1ca0607 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -189,6 +189,8 @@ Tare product Tare pckg + Checking for updates + Saving Data saved Printing job completed @@ -463,8 +465,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..689d8d58 100644 --- a/app/src/main/res/xml/app_preferences.xml +++ b/app/src/main/res/xml/app_preferences.xml @@ -67,10 +67,27 @@ 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"); + }}; } }