diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplication.java b/app/src/main/java/it/integry/integrywmsnative/MainApplication.java index b7ea2ff2..a8b35d2f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplication.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplication.java @@ -3,11 +3,13 @@ package it.integry.integrywmsnative; import android.app.Application; import android.content.res.Configuration; import android.content.res.Resources; +import android.util.Log; import javax.inject.Inject; import it.integry.integrywmsnative.core.context.AppContext; import it.integry.integrywmsnative.core.data_store.db.RoomModule; +import it.integry.integrywmsnative.core.utility.UtilityLogger; public class MainApplication extends Application { @@ -19,6 +21,8 @@ public class MainApplication extends Application { public static MainApplicationModule appModule; public static RoomModule roomModule; + private Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler; + @Inject AppContext appContext; @@ -40,6 +44,9 @@ public class MainApplication extends Application { appComponent.inject(this); res = getResources(); + + defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); + Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler); } // Called by the system when the device configuration changes while your component is running. @@ -61,4 +68,22 @@ public class MainApplication extends Application { System.exit(0); } + + // handler listener + private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = + new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread thread, Throwable ex) { + try { + UtilityLogger.error(new Exception(ex)); + } catch (Exception e) { + Log.e("Uncaught error", "Exception Logger failed!", e); + //MainApplication.exit(); + } + + // re-throw critical exception further to the os (important) + defaultUncaughtExceptionHandler.uncaughtException(thread, ex); + } + }; + } diff --git a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java index b96c0bc9..3e0cfb94 100644 --- a/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java +++ b/app/src/main/java/it/integry/integrywmsnative/MainApplicationComponent.java @@ -74,6 +74,8 @@ import it.integry.integrywmsnative.gest.pv_ordini_acquisto.PVOrdiniAcquistoGrigl import it.integry.integrywmsnative.gest.pv_ordini_acquisto.dialogs.DialogScanGrigliaAcquistoComponent; import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeComponent; import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeModule; +import it.integry.integrywmsnative.gest.settings.MainSettingsComponent; +import it.integry.integrywmsnative.gest.settings.MainSettingsModule; import it.integry.integrywmsnative.gest.spedizione.SpedizioneComponent; import it.integry.integrywmsnative.gest.spedizione.SpedizioneModule; import it.integry.integrywmsnative.gest.spedizione.dialogs.print_sscc_list.DialogPrintOrderSSCCListComponent; @@ -169,6 +171,7 @@ import it.integry.integrywmsnative.view.dialogs.scan_or_create_lu.DialogScanOrCr BottomSheetInventarioRowActionsModule.class, BottomSheetMtbColrEditModalModule.class, DialogChooseArtsFromMtbAartListModule.class, + MainSettingsModule.class, }) public interface MainApplicationComponent { @@ -285,6 +288,8 @@ public interface MainApplicationComponent { DialogChooseArtsFromMtbAartListComponent.Factory dialogDialogDialogChooseArtsFromMtbAartListViewComponent(); + MainSettingsComponent.Factory mainSettingsFragmentComponent(); + void inject(MainApplication mainApplication); void inject(AppContext mainApplication); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java b/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java index 4b65e475..bf8f6438 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/context/AppContext.java @@ -34,6 +34,8 @@ public class AppContext { @Inject SettingsManager mSettingsManager; + private File logsFolder; + public AppContext(Context context) { this.mApplicationContext = context; @@ -53,6 +55,10 @@ public class AppContext { this.initLogger(); } + public File getLogFilePath() { + return logsFolder; + } + private void initSettings() { Stash.init(mApplicationContext); @@ -82,10 +88,9 @@ public class AppContext { private void initLogger() { Logger.addLogAdapter(new AndroidLogAdapter()); - File logsFolder = new File(mApplicationContext.getExternalFilesDir(null).getAbsolutePath()); + logsFolder = new File(mApplicationContext.getExternalFilesDir(null).getAbsolutePath()); int maxBytesSize = 5 * 1024 * 1024; Logger.addLogAdapter(new DiskLogAdapter(logsFolder, maxBytesSize)); - } } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/exception/ExceptionsHandler.java b/app/src/main/java/it/integry/integrywmsnative/core/exception/ExceptionsHandler.java deleted file mode 100644 index a6310fe4..00000000 --- a/app/src/main/java/it/integry/integrywmsnative/core/exception/ExceptionsHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -package it.integry.integrywmsnative.core.exception; - -import android.app.Activity; -import android.os.Environment; -import android.os.Looper; -import android.util.Log; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.PrintWriter; - -import it.integry.integrywmsnative.MainApplication; -import it.integry.integrywmsnative.core.utility.UtilityLogger; -import it.integry.integrywmsnative.view.dialogs.exception.DialogException; - -public class ExceptionsHandler implements Thread.UncaughtExceptionHandler { - - private final static String TAG = ExceptionsHandler.class.getSimpleName(); - - private final Activity context; - - public static void init(Activity context) { - new ExceptionsHandler(context); - } - - private ExceptionsHandler(Activity context) { - this.context = context; - - //if (!BuildConfig.DEBUG) { - Thread.setDefaultUncaughtExceptionHandler(this); - - - //} - - } - - @Override - public void uncaughtException(final Thread thread, final Throwable ex) { - try { - UtilityLogger.error(new Exception(ex)); - } catch (Exception e) { - Log.e(TAG, "Exception Logger failed!", e); - MainApplication.exit(); - } - - appendToFile(new Exception(ex)); - new Thread() { - @Override - public void run() { - Looper.prepare(); - DialogException.make(context, context::finish).show(); - Looper.loop(); - } - }.start(); - - - - } - - public void appendToFile(Exception e) { - try { - File yourFile = new File(Environment.getExternalStorageDirectory(), "log.txt"); - - FileWriter fstream = new FileWriter(yourFile.getPath(), true); - BufferedWriter out = new BufferedWriter(fstream); - PrintWriter pWriter = new PrintWriter(out, true); - e.printStackTrace(pWriter); - } - catch (Exception ie) { - throw new RuntimeException("Could not write Exception to file", ie); - } - } -} \ No newline at end of file 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 f9d81216..b1c0045d 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 @@ -101,12 +101,7 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { } - public static void sendErrorLogMail(String message) { - sendErrorLogMail(message, null, null); - } - - - public static void sendErrorLogMail(String message, Runnable onComplete, RunnableArgs onFailed) { + public void sendErrorLogMail(String message, Runnable onComplete, RunnableArgs onFailed) { String currentAzienda = UtilityString.isNullOrEmpty(SettingsManager.i().getUserSession().getProfileDB()) ? "" : " [" + SettingsManager.i().getUserSession().getProfileDB() + "]"; @@ -135,10 +130,10 @@ public class SystemRESTConsumer extends _BaseRESTConsumer { } - public static void sendMail(MailRequestDTO mailDTO, Runnable onComplete, RunnableArgs onFailed) { + public void sendMail(MailRequestDTO mailDTO, Runnable onComplete, RunnableArgs onFailed) { SystemRESTConsumerService service = RESTBuilder.getService(SystemRESTConsumerService.class); - service.sendMail(mailDTO).enqueue(new Callback>() { + service.sendMail(mailDTO).enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { if (onComplete != null) onComplete.run(); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/MailAttachmentDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/MailAttachmentDTO.java new file mode 100644 index 00000000..2f5cdfdd --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/MailAttachmentDTO.java @@ -0,0 +1,25 @@ +package it.integry.integrywmsnative.core.rest.model; + +public class MailAttachmentDTO { + + private String fileName; + private String fileb64Content; + + public String getFileName() { + return fileName; + } + + public MailAttachmentDTO setFileName(String fileName) { + this.fileName = fileName; + return this; + } + + public String getFileb64Content() { + return fileb64Content; + } + + public MailAttachmentDTO setFileb64Content(String fileb64Content) { + this.fileb64Content = fileb64Content; + return this; + } +} diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/MailRequestDTO.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/MailRequestDTO.java index ed282c3b..d71b3928 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/model/MailRequestDTO.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/model/MailRequestDTO.java @@ -1,5 +1,7 @@ package it.integry.integrywmsnative.core.rest.model; +import java.util.List; + public class MailRequestDTO { private String from; @@ -11,6 +13,7 @@ public class MailRequestDTO { private String ccn; private String subject; private String msgText; + private List attachments; private boolean isHtml = false; private boolean isDebug = false; @@ -95,6 +98,15 @@ public class MailRequestDTO { return this; } + public List getAttachments() { + return attachments; + } + + public MailRequestDTO setAttachments(List attachments) { + this.attachments = attachments; + return this; + } + public boolean isHtml() { return isHtml; } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java index 63798bcc..70e8f03f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ProdOrdineProduzioneElencoFragment.java @@ -316,7 +316,8 @@ public class ProdOrdineProduzioneElencoFragment extends BaseFragment implements .filter(y -> y.getBarcode().equals(x.getBarcode())) .map(y -> new MainListProdOrdineProduzioneElencoClienteListModel() .setPrimaryText(y.getRifOrd()) - .setRightText(y.getCodJcom())) + .setRightText(y.getCodJcom()) + .setOriginalModel(y)) .toList(); listModel.setClientiListModel(clienti); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoClienteListModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoClienteListModel.java index 8fb00900..5aa2af93 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoClienteListModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/prod_accettazione_ord_produzione/ui/MainListProdOrdineProduzioneElencoClienteListModel.java @@ -1,9 +1,13 @@ package it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ui; +import it.integry.integrywmsnative.gest.accettazione.dto.OrdineAccettazioneInevasoDTO; + public class MainListProdOrdineProduzioneElencoClienteListModel { private String primaryText; private String rightText; + private OrdineAccettazioneInevasoDTO originalModel; + public String getPrimaryText() { return primaryText; @@ -22,4 +26,13 @@ public class MainListProdOrdineProduzioneElencoClienteListModel { this.rightText = rightText; return this; } + + public OrdineAccettazioneInevasoDTO getOriginalModel() { + return originalModel; + } + + public MainListProdOrdineProduzioneElencoClienteListModel setOriginalModel(OrdineAccettazioneInevasoDTO originalModel) { + this.originalModel = originalModel; + return this; + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsComponent.java b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsComponent.java new file mode 100644 index 00000000..26c4dc60 --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsComponent.java @@ -0,0 +1,17 @@ +package it.integry.integrywmsnative.gest.settings; + +import dagger.Subcomponent; + +@Subcomponent +public interface MainSettingsComponent { + + + @Subcomponent.Factory + interface Factory { + + MainSettingsComponent create(); + } + + void inject(MainSettingsFragment mainSettingsFragment); + +} 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 02ca2557..d9fccf32 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,9 +3,14 @@ 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.util.Base64; +import android.util.Base64OutputStream; import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatTextView; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; @@ -15,25 +20,58 @@ import androidx.preference.PreferenceFragmentCompat; import com.annimon.stream.Stream; import com.harrysoft.androidbluetoothserial.BluetoothManager; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; import java.util.ArrayList; import java.util.Collection; +import javax.inject.Inject; + import it.integry.barcode_base_android_library.model.BarcodeSetting; +import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; +import it.integry.integrywmsnative.core.context.AppContext; 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.utility.UtilityResources; +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 { + @Inject + public AppContext appContext; + @Inject + public SystemRESTConsumer systemRESTConsumer; + @Inject + public DialogProgressView mCurrentProgress; + private boolean progressOpened; + private final ArrayList onPreDestroyList = new ArrayList<>(); 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_EXPORT_LOG = "EXPORT_LOG"; private Collection btPairedDevices; + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + MainApplication + .appComponent + .mainSettingsFragmentComponent() + .create() + .inject(this); + } + @Override public void onCreateActionBar(AppCompatTextView titleText, Context context) { titleText.setText(context.getText(R.string.settings_category).toString()); @@ -55,6 +93,13 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT loadScanModePreferences(); triggerScanModeListPref.setOnPreferenceChangeListener(this); triggerScanModeListPref.setSummary(triggerScanModeListPref.getValue()); + + Preference button = findPreference(KEY_BUTTON_EXPORT_LOG); + button.setOnPreferenceClickListener(preference -> { + exportLog(); + return true; + }); + } @@ -164,4 +209,74 @@ public class MainSettingsFragment extends PreferenceFragmentCompat implements IT listPref.setSummary(btDeviceName); } + + private void exportLog() { + DialogYesNoView.newInstance("Esportazione log", "Vuoi inviare il log degli eventi al supporto?", result -> { + this.openProgress(); + + File yourFile = appContext.getLogFilePath(); + var files = yourFile.listFiles(); + + var fileToShare = Stream.of(files) + .sortBy(x -> -1 * x.lastModified()) + .findFirstOrElse(null); + try { + FileInputStream fis = new FileInputStream(fileToShare); + + byte[] buffer = new byte[fis.available()];//specify the size to allow + int bytesRead; + ByteArrayOutputStream output = new ByteArrayOutputStream(); + Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT); + + while ((bytesRead = fis.read(buffer)) != -1) { + output64.write(buffer, 0, bytesRead); + } + + output64.close(); + + var attachment = new MailAttachmentDTO() + .setFileName("wms_log.log") + .setFileb64Content(output.toString()); + + var mailRequest = new MailRequestDTO() + .setTo("developer@integry.it") + .setMsgText("Questo è una mail che contiene il log del WMS") + .setSubject("U vuemmeess") + .setAttachments(new ArrayList<>()); + + mailRequest.getAttachments().add(attachment); + + systemRESTConsumer.sendMail(mailRequest, this::closeProgress, ex -> { + this.closeProgress(); + DialogSimpleMessageView + .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) + .show(requireActivity().getSupportFragmentManager(), "tag"); + }); + } catch (Exception ex) { + DialogSimpleMessageView + .makeErrorDialog(new SpannableString(Html.fromHtml(ex.getMessage())), null, null) + .show(requireActivity().getSupportFragmentManager(), "tag"); + } + }) + .show(getParentFragmentManager(), "tag"); + } + + + private void openProgress() { + if (!progressOpened && !this.mCurrentProgress.isAdded()) { + this.progressOpened = true; + requireActivity().runOnUiThread(() -> { + this.mCurrentProgress.show(requireActivity().getSupportFragmentManager(), "tag"); + }); + } + } + + private void closeProgress() { + if (progressOpened) { + this.progressOpened = false; + requireActivity().runOnUiThread(() -> { + mCurrentProgress.dismiss(); + }); + } + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsModule.java new file mode 100644 index 00000000..05ec439d --- /dev/null +++ b/app/src/main/java/it/integry/integrywmsnative/gest/settings/MainSettingsModule.java @@ -0,0 +1,8 @@ +package it.integry.integrywmsnative.gest.settings; + +import dagger.Module; + +@Module(subcomponents = MainSettingsComponent.class) +public class MainSettingsModule { + +} diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1b14c809..673ed822 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -421,6 +421,9 @@ Stampa etichetta spedizione Stampa etichetta lavorazione Impostazioni scanner + Svilupppo + Esporta log + Esporta il log degli eventi Ritardo scansione Imposta un ritardo di lettura per la scansione Modalità scansione diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8be3c0ad..c0f6948b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -427,6 +427,9 @@ Print shipping label Print production label Scanner settings + Developer settings + Esporta log + Esporta il log degli eventi 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 7ec23d6c..ea9d0a23 100644 --- a/app/src/main/res/xml/app_preferences.xml +++ b/app/src/main/res/xml/app_preferences.xml @@ -62,6 +62,19 @@ app:title="@string/scanner_settings_scanner_delay_title" /> + + + + + + \ No newline at end of file