From cf3bc2baeece8c30973b279415b0e6f54727470a Mon Sep 17 00:00:00 2001 From: "saad.siddiq" Date: Fri, 23 May 2025 11:44:15 +0500 Subject: [PATCH] Add manual entry procedure for presented and selected carton, packs and pieces. --- app/build.gradle | 4 +- .../apiservice/RetrofitClient.java | 4 +- .../models/InspectionReportItem.java | 18 ++--- .../qualitychecker/store/Store.java | 18 +++++ .../ui/activities/HomeActivity.java | 34 ++++++++- .../ui/fragments/FirstStepFragment.java | 65 ++++++++++++----- .../ui/fragments/ThirdStepFragment.java | 27 ++++++++ .../qualitychecker/utils/FileUtils.java | 69 +++++++++++++++++++ .../main/res/layout/fragment_third_step.xml | 11 +++ 9 files changed, 218 insertions(+), 32 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 42f64ef..37e67ef 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.utopiaindustries.qualitychecker" minSdk 24 targetSdk 34 - versionCode 5 - versionName "1.4" + versionCode 7 + versionName "1.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/apiservice/RetrofitClient.java b/app/src/main/java/com/utopiaindustries/qualitychecker/apiservice/RetrofitClient.java index 28e238d..70a96f8 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/apiservice/RetrofitClient.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/apiservice/RetrofitClient.java @@ -19,8 +19,8 @@ import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitClient { - //private final static String BASE_URL = "https://portal.utopiaindustries.pk/uind/"; - private final static String BASE_URL = "http://192.168.91.44:8081/uind/";//"http://192.168.91.44:8081/uind/";//"http://192.168.90.27:8080/uind/";//"http://192.168.91.16:8080/uind/"; + private final static String BASE_URL = "https://portal.utopiaindustries.pk/uind/"; + //private final static String BASE_URL = "http://192.168.91.44:8081/uind/";//"http://192.168.91.44:8081/uind/";//"http://192.168.90.27:8080/uind/";//"http://192.168.91.16:8080/uind/"; private static Retrofit retrofit; diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionReportItem.java b/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionReportItem.java index 2516263..20c8b79 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionReportItem.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionReportItem.java @@ -28,9 +28,9 @@ public class InspectionReportItem implements Serializable { private float totalPresentPacks; private float totalPresentCartons; // sqrt( totalPresentCartons ) - private float cartonsSelected; - private float packsSelected; - private float piecesSelected; + private int cartonsSelected; + private int packsSelected; + private int piecesSelected; private float cartonWeight; private float cartonLength; @@ -229,19 +229,19 @@ public class InspectionReportItem implements Serializable { this.totalPresentCartons = totalPresentCartons; } - public float getCartonsSelected() { + public int getCartonsSelected() { return cartonsSelected; } - public void setCartonsSelected(float cartonsSelected) { + public void setCartonsSelected(int cartonsSelected) { this.cartonsSelected = cartonsSelected; } - public float getPacksSelected() { + public int getPacksSelected() { return packsSelected; } - public void setPacksSelected(float packsSelected) { + public void setPacksSelected(int packsSelected) { this.packsSelected = packsSelected; } @@ -253,11 +253,11 @@ public class InspectionReportItem implements Serializable { this.packingDetails = packingDetails; } - public float getPiecesSelected() { + public int getPiecesSelected() { return piecesSelected; } - public void setPiecesSelected(float piecesSelected) { + public void setPiecesSelected(int piecesSelected) { this.piecesSelected = piecesSelected; } diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/store/Store.java b/app/src/main/java/com/utopiaindustries/qualitychecker/store/Store.java index bd37e04..9432cee 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/store/Store.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/store/Store.java @@ -37,6 +37,8 @@ public class Store { private EmployeePhoto employeePhoto; private List itemUnits; private List checkpointSkus; + private boolean isNewReportPresented; + private boolean isNewReportSelected; private Store(){ } @@ -234,6 +236,22 @@ public class Store { this.checkpointSkus = checkpointSkus; } + public boolean isNewReportPresented() { + return isNewReportPresented; + } + + public void setNewReportPresented(boolean newReportPresented) { + isNewReportPresented = newReportPresented; + } + + public boolean isNewReportSelected() { + return isNewReportSelected; + } + + public void setNewReportSelected(boolean newReportSelected) { + isNewReportSelected = newReportSelected; + } + @Override public String toString() { return "Store{" + diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/activities/HomeActivity.java b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/activities/HomeActivity.java index 2de7d56..99f98f0 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/activities/HomeActivity.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/activities/HomeActivity.java @@ -68,7 +68,12 @@ import com.utopiaindustries.qualitychecker.utils.PropertyReader; import com.utopiaindustries.qualitychecker.utils.Release; import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.io.ObjectInputStream; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -589,7 +594,7 @@ private int generateRandomNumber(int min, int max) { reportsUploadBtn.setEnabled(false); final int[] uploadedCount = {0}; - for ( InspectionReport report : reports ){ + for ( InspectionReport report : reports ) { service.saveReport(report, new SaveReportCallback() { @Override public void onSuccess() { @@ -613,9 +618,10 @@ private int generateRandomNumber(int min, int max) { } @Override public void onFailure(Throwable throwable) { + Log.e("Message: ",""+throwable.getMessage()); uploadedCount[0]++; // Even on failure, increment the counter to avoid locking the button forever - + //logErrorToFile(throwable); NotificationHelper.showNotification( HomeActivity.this, "Report Uploading", @@ -648,6 +654,11 @@ private int generateRandomNumber(int min, int max) { try { // get file from path byte[] result = FileUtils.readFile( wrapper.getContent() ); + /*FileUtils.copyFile(this, wrapper.getContent(), "Reports"); + Object obj = FileUtils.readSerializedObject(wrapper.getContent()); + if (obj != null) { + FileUtils.writeObjectToReadableFile(this, obj, "report_readable.txt"); + }*/ ByteArrayInputStream byteIn = new ByteArrayInputStream( result ); ObjectInputStream in = new ObjectInputStream(byteIn); InspectionReport report = ( InspectionReport ) in.readObject(); @@ -661,4 +672,23 @@ private int generateRandomNumber(int min, int max) { } return reports; } + + private void logErrorToFile(Throwable throwable) { + try { + File logFile = new File(getExternalFilesDir(null), "upload_error_log.txt"); + FileWriter writer = new FileWriter(logFile, true); // append mode + writer.write("Error: " + throwable.toString() + "\n"); + if (throwable.getMessage() != null) { + writer.write("Message: " + throwable.getMessage() + "\n"); + } + StringWriter sw = new StringWriter(); + throwable.printStackTrace(new PrintWriter(sw)); + writer.write(sw.toString()); + writer.write("\n------------------------\n"); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/FirstStepFragment.java b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/FirstStepFragment.java index 25c7d79..8eea952 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/FirstStepFragment.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/FirstStepFragment.java @@ -355,7 +355,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener public void onTextChanged(CharSequence s, int start, int before, int count) { try { int packsCount = 0, piecesCount = 0; - int boxCount = (int) Double.parseDouble(s.toString()); + int boxCount = Integer.parseInt(s.toString()); if (itemPerBox.getText().toString().isEmpty() || pieces.getText().toString().isEmpty()) { Toast.makeText(getContext(), "Enter Item/Pieces Per box", Toast.LENGTH_SHORT).show(); } else { @@ -365,22 +365,33 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener int totalPacks = boxCount * packsCount; int totalPieces = totalPacks * piecesCount; - itemPerBoxSelected.setText(String.valueOf(totalPacks)); - //store.getReport().getItems().get(0).setPacksSelected(Long.parseLong(String.valueOf(totalPacks))); - piecesSelected.setText(String.valueOf(totalPieces)); - //store.getReport().getItems().get(0).setPiecesSelected(Long.parseLong(String.valueOf(totalPieces))); + //store.getReport().getItems().get(0).setPacksSelected(Long.parseLong(s.toString())); + if (store.isNewReportSelected()) { + //Log.e("Selected: ",""+store.isNewReportSelected()); + //Log.e("bool-selected-1: ",""+store.isNewReportSelected()); + //Log.e("bool-selected-2: ","true"); + itemPerBoxSelected.setText(String.valueOf(totalPacks)); + piecesSelected.setText(String.valueOf(totalPieces)); + } + else { + //Log.e("bool-selected-3: ","false"); + //Log.e("bool-selected-4: ","false"+String.valueOf(store.getReport().getItems().get(0).getPacksSelected())); + //Log.e("bool-selected-5: ","false"+String.valueOf(store.getReport().getItems().get(0).getPiecesSelected())); + itemPerBoxSelected.setText(String.valueOf(store.getReport().getItems().get(0).getPacksSelected())); + piecesSelected.setText(String.valueOf(store.getReport().getItems().get(0).getPiecesSelected())); + } } - store.getReport().getItems().get(0).setCartonsSelected(Float.parseFloat(s.toString())); + store.getReport().getItems().get(0).setCartonsSelected(Integer.parseInt(s.toString())); } catch (Exception e) { e.printStackTrace(); store.getReport().getItems().get(0).setCartonsSelected(0); + store.setNewReportSelected(true); } } @Override public void afterTextChanged(Editable s) { - } }); @@ -388,11 +399,12 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener checkedBoxCartonSelected.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { - + //Log.e("beforeTextChanged: ","***"); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { + //Log.e("onTextChanged: ","***"); try { int packsCount = 0, piecesCount = 0; int boxCount = Integer.parseInt(s.toString()); @@ -405,19 +417,30 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener int totalPacks = boxCount * packsCount; int totalPieces = totalPacks * piecesCount; - checkedItemPerBoxSelected.setText(String.valueOf(totalPacks)); - checkedPiecesSelected.setText(String.valueOf(totalPieces)); + if (store.isNewReportPresented()) { + //Log.e("bool-presented-1: ",""+store.isNewReportPresented()); + //Log.e("bool-presented-2: ","true"); + checkedItemPerBoxSelected.setText(String.valueOf(totalPacks)); + checkedPiecesSelected.setText(String.valueOf(totalPieces)); + } + else { + //Log.e("bool-presented-3: ","false"); + checkedItemPerBoxSelected.setText(String.valueOf(store.getReport().getItems().get(0).getCheckedPacksSelected())); + checkedPiecesSelected.setText(String.valueOf(store.getReport().getItems().get(0).getCheckedPiecesSelected())); + } } store.getReport().getItems().get(0).setCheckedCartonsSelected(Integer.parseInt(s.toString())); } catch (Exception e) { store.getReport().getItems().get(0).setCheckedCartonsSelected(0); + store.setNewReportPresented(true); + } } @Override public void afterTextChanged(Editable s) { - + //Log.e("afterTextChanged: ","***"); } }); @@ -430,7 +453,8 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { - store.getReport().getItems().get(0).setPacksSelected(Long.parseLong(s.toString())); + //Log.e("bool-selected-onTextChanged: "," itemPerBoxSelected"); + store.getReport().getItems().get(0).setPacksSelected(Integer.parseInt(s.toString())); } catch (Exception e) { store.getReport().getItems().get(0).setPacksSelected(0); } @@ -452,6 +476,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { + //Log.e("bool-presented-onTextChanged: "," checkedItemPerBoxSelected"); store.getReport().getItems().get(0).setCheckedPacksSelected(Integer.parseInt(s.toString())); } catch (Exception e) { store.getReport().getItems().get(0).setCheckedPacksSelected(0); @@ -473,7 +498,8 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { - store.getReport().getItems().get(0).setPiecesSelected(Long.parseLong(s.toString())); + //Log.e("bool-selected-onTextChanged: "," piecesSelected"); + store.getReport().getItems().get(0).setPiecesSelected(Integer.parseInt(s.toString())); } catch (Exception e) { store.getReport().getItems().get(0).setPiecesSelected(0); } @@ -495,6 +521,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { + //Log.e("bool-presented-onTextChanged: "," checkedPiecesSelected"); store.getReport().getItems().get(0).setCheckedPiecesSelected(Integer.parseInt(s.toString())); } catch (Exception e) { store.getReport().getItems().get(0).setCheckedPiecesSelected(0); @@ -502,8 +529,8 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener try { //calculate aql sample size - Log.e("ItemPresentedDetails-pieces: ", "" + s.toString()); - Log.e("ItemPresentedDetails-inspectionLevel: ", "" + inspectionLevel); + //Log.e("ItemPresentedDetails-pieces: ", "" + s.toString()); + //Log.e("ItemPresentedDetails-inspectionLevel: ", "" + inspectionLevel); if (!s.toString().isEmpty() && s.toString() != null) { trackSampleCode(Integer.parseInt(s.toString()), (int) Double.parseDouble(inspectionLevel), Double.parseDouble(qualityLevelMajor), Double.parseDouble(qualityLevelMinor)); } @@ -756,6 +783,8 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener navController = Navigation.findNavController(requireView()); if (v.getId() == R.id.button_draft_first) { + store.setNewReportPresented(false); + store.setNewReportSelected(false); //--Draft Incomplete Report //Log.e("sku: ",""+sku.getText().toString()); //Log.e("Market-place: ",""+store.getReport().getItems().get(0).getMarketplace()); @@ -810,6 +839,8 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener if (v.getId() == R.id.button_right_frag_1) { if (!sku.getText().toString().isEmpty() && !store.getReport().getItems().get(0).getMarketplace().equalsIgnoreCase("[ Marketplace ]")) { navController.navigate(R.id.action_firstStepFragment_to_secondStepFragment); + store.setNewReportPresented(false); + store.setNewReportSelected(false); } else { Toast.makeText(getContext(), "Please enter or scan sku details", Toast.LENGTH_SHORT).show(); } @@ -933,7 +964,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener boxCarton.setText(boxCartonText); packagingDetails.setText(packagingDetailsText); - Log.e("Carton: ",""+String.valueOf(store.getReport().getItems().get(0).getCartonsSelected())); + //Log.e("Carton: ",""+String.valueOf(store.getReport().getItems().get(0).getCartonsSelected())); boxCartonSelected.setText(String.valueOf(store.getReport().getItems().get(0).getCartonsSelected())); //itemPerBoxSelected.setText(String.valueOf(store.getReport().getItems().get(0).getPacksSelected())); @@ -1247,7 +1278,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener + "\nSampleSizeMinor: " + sampleSizeMinor; txtTesting.setText(testDetails); - Log.e("SampleSizeMajor: ",""+sampleSizeMajor); + //Log.e("SampleSizeMajor: ",""+sampleSizeMajor); aqlSampleSize.setText(String.valueOf(sampleSizeMajor)); store.getReport().getItems().get(0).setSampleSize(sampleSizeMajor); diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/ThirdStepFragment.java b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/ThirdStepFragment.java index 4c0d0a8..032c4ec 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/ThirdStepFragment.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/ThirdStepFragment.java @@ -442,6 +442,33 @@ public class ThirdStepFragment extends Fragment implements View.OnClickListener } } + /*private void saveReportDirectlyToServer(Store store) { + apiService.saveInspectionReport(store.getReport()).enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + progressBar.setVisibility(View.GONE); + if (response.isSuccessful()) { + System.out.println(response.body()); + Log.e("Response-Successful: ",""+response.body()); + if (response.body().get("result").equalsIgnoreCase("success")) { + Toast.makeText(getContext(), "Report saved successfully", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(getContext(), "Error in saving report", Toast.LENGTH_SHORT).show(); + } + } else { + Toast.makeText(getContext(), "Error in saving report", Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + progressBar.setVisibility(View.GONE); + Log.e("onFailure-message",""+t.getMessage()); + } + } + ); + }*/ + private void saveReportDialog() { LayoutInflater inflater = LayoutInflater.from(getContext()); View dialogView = inflater.inflate(R.layout.save_report_dialog, null); diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/utils/FileUtils.java b/app/src/main/java/com/utopiaindustries/qualitychecker/utils/FileUtils.java index 1382ee9..baa55f3 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/utils/FileUtils.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/utils/FileUtils.java @@ -9,6 +9,7 @@ import android.net.NetworkInfo; import android.net.Uri; import android.os.Handler; import android.os.Looper; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ProgressBar; @@ -27,8 +28,10 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; +import java.io.ObjectInputStream; import java.util.Objects; import java.util.function.Consumer; @@ -233,4 +236,70 @@ public class FileUtils { NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } + + public static boolean copyFile(Context context, String sourcePath, String destFileName) { + try { + // Read bytes from source file + byte[] fileBytes = readFile(sourcePath); + + // Write bytes to new file in external files directory + File destFile = new File(context.getExternalFilesDir(null), destFileName); + try (FileOutputStream fos = new FileOutputStream(destFile)) { + fos.write(fileBytes); + fos.flush(); + } + + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + public static void exportFileToExternalStorage(final Context context, String internalFileName) { + try { + // Source: internal storage file + File internalFile = new File(context.getFilesDir(), internalFileName); + + // Destination: external storage file + File externalFile = new File(context.getExternalFilesDir(null), internalFileName); + + FileInputStream fis = new FileInputStream(internalFile); + FileOutputStream fos = new FileOutputStream(externalFile); + + byte[] buffer = new byte[1024]; + int length; + while ((length = fis.read(buffer)) > 0) { + fos.write(buffer, 0, length); + } + + fis.close(); + fos.close(); + + //Toast.makeText(this, "Exported to: " + externalFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static Object readSerializedObject(String filePath) { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath))) { + return ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + return null; + } + } + + public static void writeObjectToReadableFile(Context context, Object obj, String outputFileName) { + File outputFile = new File(context.getExternalFilesDir(null), outputFileName); + try (FileWriter writer = new FileWriter(outputFile)) { + writer.write(obj.toString()); // You can also use a JSON library here if needed + writer.flush(); + Log.e("FileUtils", "Object written to: " + outputFile.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } diff --git a/app/src/main/res/layout/fragment_third_step.xml b/app/src/main/res/layout/fragment_third_step.xml index b23f0e4..e0db2cd 100644 --- a/app/src/main/res/layout/fragment_third_step.xml +++ b/app/src/main/res/layout/fragment_third_step.xml @@ -856,4 +856,15 @@ android:text="Add Dimensions" /> + + \ No newline at end of file