Add manual entry procedure for presented and selected carton, packs and pieces.

main
saad.siddiq 2025-05-23 11:44:15 +05:00
parent 79dd070d65
commit cf3bc2baee
9 changed files with 218 additions and 32 deletions

View File

@ -10,8 +10,8 @@ android {
applicationId "com.utopiaindustries.qualitychecker" applicationId "com.utopiaindustries.qualitychecker"
minSdk 24 minSdk 24
targetSdk 34 targetSdk 34
versionCode 5 versionCode 7
versionName "1.4" versionName "1.6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@ -19,8 +19,8 @@ import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitClient { public class RetrofitClient {
//private final static String BASE_URL = "https://portal.utopiaindustries.pk/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 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; private static Retrofit retrofit;

View File

@ -28,9 +28,9 @@ public class InspectionReportItem implements Serializable {
private float totalPresentPacks; private float totalPresentPacks;
private float totalPresentCartons; private float totalPresentCartons;
// sqrt( totalPresentCartons ) // sqrt( totalPresentCartons )
private float cartonsSelected; private int cartonsSelected;
private float packsSelected; private int packsSelected;
private float piecesSelected; private int piecesSelected;
private float cartonWeight; private float cartonWeight;
private float cartonLength; private float cartonLength;
@ -229,19 +229,19 @@ public class InspectionReportItem implements Serializable {
this.totalPresentCartons = totalPresentCartons; this.totalPresentCartons = totalPresentCartons;
} }
public float getCartonsSelected() { public int getCartonsSelected() {
return cartonsSelected; return cartonsSelected;
} }
public void setCartonsSelected(float cartonsSelected) { public void setCartonsSelected(int cartonsSelected) {
this.cartonsSelected = cartonsSelected; this.cartonsSelected = cartonsSelected;
} }
public float getPacksSelected() { public int getPacksSelected() {
return packsSelected; return packsSelected;
} }
public void setPacksSelected(float packsSelected) { public void setPacksSelected(int packsSelected) {
this.packsSelected = packsSelected; this.packsSelected = packsSelected;
} }
@ -253,11 +253,11 @@ public class InspectionReportItem implements Serializable {
this.packingDetails = packingDetails; this.packingDetails = packingDetails;
} }
public float getPiecesSelected() { public int getPiecesSelected() {
return piecesSelected; return piecesSelected;
} }
public void setPiecesSelected(float piecesSelected) { public void setPiecesSelected(int piecesSelected) {
this.piecesSelected = piecesSelected; this.piecesSelected = piecesSelected;
} }

View File

@ -37,6 +37,8 @@ public class Store {
private EmployeePhoto employeePhoto; private EmployeePhoto employeePhoto;
private List<ItemUnit> itemUnits; private List<ItemUnit> itemUnits;
private List<InspectionCheckpointSku> checkpointSkus; private List<InspectionCheckpointSku> checkpointSkus;
private boolean isNewReportPresented;
private boolean isNewReportSelected;
private Store(){ private Store(){
} }
@ -234,6 +236,22 @@ public class Store {
this.checkpointSkus = checkpointSkus; 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 @Override
public String toString() { public String toString() {
return "Store{" + return "Store{" +

View File

@ -68,7 +68,12 @@ import com.utopiaindustries.qualitychecker.utils.PropertyReader;
import com.utopiaindustries.qualitychecker.utils.Release; import com.utopiaindustries.qualitychecker.utils.Release;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -589,7 +594,7 @@ private int generateRandomNumber(int min, int max) {
reportsUploadBtn.setEnabled(false); reportsUploadBtn.setEnabled(false);
final int[] uploadedCount = {0}; final int[] uploadedCount = {0};
for ( InspectionReport report : reports ){ for ( InspectionReport report : reports ) {
service.saveReport(report, new SaveReportCallback() { service.saveReport(report, new SaveReportCallback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
@ -613,9 +618,10 @@ private int generateRandomNumber(int min, int max) {
} }
@Override @Override
public void onFailure(Throwable throwable) { public void onFailure(Throwable throwable) {
Log.e("Message: ",""+throwable.getMessage());
uploadedCount[0]++; uploadedCount[0]++;
// Even on failure, increment the counter to avoid locking the button forever // Even on failure, increment the counter to avoid locking the button forever
//logErrorToFile(throwable);
NotificationHelper.showNotification( NotificationHelper.showNotification(
HomeActivity.this, HomeActivity.this,
"Report Uploading", "Report Uploading",
@ -648,6 +654,11 @@ private int generateRandomNumber(int min, int max) {
try { try {
// get file from path // get file from path
byte[] result = FileUtils.readFile( wrapper.getContent() ); 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 ); ByteArrayInputStream byteIn = new ByteArrayInputStream( result );
ObjectInputStream in = new ObjectInputStream(byteIn); ObjectInputStream in = new ObjectInputStream(byteIn);
InspectionReport report = ( InspectionReport ) in.readObject(); InspectionReport report = ( InspectionReport ) in.readObject();
@ -661,4 +672,23 @@ private int generateRandomNumber(int min, int max) {
} }
return reports; 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();
}
}
} }

View File

@ -355,7 +355,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
try { try {
int packsCount = 0, piecesCount = 0; 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()) { if (itemPerBox.getText().toString().isEmpty() || pieces.getText().toString().isEmpty()) {
Toast.makeText(getContext(), "Enter Item/Pieces Per box", Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), "Enter Item/Pieces Per box", Toast.LENGTH_SHORT).show();
} else { } else {
@ -365,22 +365,33 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
int totalPacks = boxCount * packsCount; int totalPacks = boxCount * packsCount;
int totalPieces = totalPacks * piecesCount; int totalPieces = totalPacks * piecesCount;
itemPerBoxSelected.setText(String.valueOf(totalPacks)); //store.getReport().getItems().get(0).setPacksSelected(Long.parseLong(s.toString()));
//store.getReport().getItems().get(0).setPacksSelected(Long.parseLong(String.valueOf(totalPacks))); if (store.isNewReportSelected()) {
piecesSelected.setText(String.valueOf(totalPieces)); //Log.e("Selected: ",""+store.isNewReportSelected());
//store.getReport().getItems().get(0).setPiecesSelected(Long.parseLong(String.valueOf(totalPieces))); //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) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
store.getReport().getItems().get(0).setCartonsSelected(0); store.getReport().getItems().get(0).setCartonsSelected(0);
store.setNewReportSelected(true);
} }
} }
@Override @Override
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
} }
}); });
@ -388,11 +399,12 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
checkedBoxCartonSelected.addTextChangedListener(new TextWatcher() { checkedBoxCartonSelected.addTextChangedListener(new TextWatcher() {
@Override @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//Log.e("beforeTextChanged: ","***");
} }
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
//Log.e("onTextChanged: ","***");
try { try {
int packsCount = 0, piecesCount = 0; int packsCount = 0, piecesCount = 0;
int boxCount = Integer.parseInt(s.toString()); int boxCount = Integer.parseInt(s.toString());
@ -405,19 +417,30 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
int totalPacks = boxCount * packsCount; int totalPacks = boxCount * packsCount;
int totalPieces = totalPacks * piecesCount; int totalPieces = totalPacks * piecesCount;
checkedItemPerBoxSelected.setText(String.valueOf(totalPacks)); if (store.isNewReportPresented()) {
checkedPiecesSelected.setText(String.valueOf(totalPieces)); //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())); store.getReport().getItems().get(0).setCheckedCartonsSelected(Integer.parseInt(s.toString()));
} catch (Exception e) { } catch (Exception e) {
store.getReport().getItems().get(0).setCheckedCartonsSelected(0); store.getReport().getItems().get(0).setCheckedCartonsSelected(0);
store.setNewReportPresented(true);
} }
} }
@Override @Override
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
//Log.e("afterTextChanged: ","***");
} }
}); });
@ -430,7 +453,8 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
try { 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) { } catch (Exception e) {
store.getReport().getItems().get(0).setPacksSelected(0); store.getReport().getItems().get(0).setPacksSelected(0);
} }
@ -452,6 +476,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
try { try {
//Log.e("bool-presented-onTextChanged: "," checkedItemPerBoxSelected");
store.getReport().getItems().get(0).setCheckedPacksSelected(Integer.parseInt(s.toString())); store.getReport().getItems().get(0).setCheckedPacksSelected(Integer.parseInt(s.toString()));
} catch (Exception e) { } catch (Exception e) {
store.getReport().getItems().get(0).setCheckedPacksSelected(0); store.getReport().getItems().get(0).setCheckedPacksSelected(0);
@ -473,7 +498,8 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
try { 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) { } catch (Exception e) {
store.getReport().getItems().get(0).setPiecesSelected(0); store.getReport().getItems().get(0).setPiecesSelected(0);
} }
@ -495,6 +521,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
try { try {
//Log.e("bool-presented-onTextChanged: "," checkedPiecesSelected");
store.getReport().getItems().get(0).setCheckedPiecesSelected(Integer.parseInt(s.toString())); store.getReport().getItems().get(0).setCheckedPiecesSelected(Integer.parseInt(s.toString()));
} catch (Exception e) { } catch (Exception e) {
store.getReport().getItems().get(0).setCheckedPiecesSelected(0); store.getReport().getItems().get(0).setCheckedPiecesSelected(0);
@ -502,8 +529,8 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
try { try {
//calculate aql sample size //calculate aql sample size
Log.e("ItemPresentedDetails-pieces: ", "" + s.toString()); //Log.e("ItemPresentedDetails-pieces: ", "" + s.toString());
Log.e("ItemPresentedDetails-inspectionLevel: ", "" + inspectionLevel); //Log.e("ItemPresentedDetails-inspectionLevel: ", "" + inspectionLevel);
if (!s.toString().isEmpty() && s.toString() != null) { if (!s.toString().isEmpty() && s.toString() != null) {
trackSampleCode(Integer.parseInt(s.toString()), (int) Double.parseDouble(inspectionLevel), Double.parseDouble(qualityLevelMajor), Double.parseDouble(qualityLevelMinor)); 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()); navController = Navigation.findNavController(requireView());
if (v.getId() == R.id.button_draft_first) { if (v.getId() == R.id.button_draft_first) {
store.setNewReportPresented(false);
store.setNewReportSelected(false);
//--Draft Incomplete Report //--Draft Incomplete Report
//Log.e("sku: ",""+sku.getText().toString()); //Log.e("sku: ",""+sku.getText().toString());
//Log.e("Market-place: ",""+store.getReport().getItems().get(0).getMarketplace()); //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 (v.getId() == R.id.button_right_frag_1) {
if (!sku.getText().toString().isEmpty() && !store.getReport().getItems().get(0).getMarketplace().equalsIgnoreCase("[ Marketplace ]")) { if (!sku.getText().toString().isEmpty() && !store.getReport().getItems().get(0).getMarketplace().equalsIgnoreCase("[ Marketplace ]")) {
navController.navigate(R.id.action_firstStepFragment_to_secondStepFragment); navController.navigate(R.id.action_firstStepFragment_to_secondStepFragment);
store.setNewReportPresented(false);
store.setNewReportSelected(false);
} else { } else {
Toast.makeText(getContext(), "Please enter or scan sku details", Toast.LENGTH_SHORT).show(); 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); boxCarton.setText(boxCartonText);
packagingDetails.setText(packagingDetailsText); 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())); boxCartonSelected.setText(String.valueOf(store.getReport().getItems().get(0).getCartonsSelected()));
//itemPerBoxSelected.setText(String.valueOf(store.getReport().getItems().get(0).getPacksSelected())); //itemPerBoxSelected.setText(String.valueOf(store.getReport().getItems().get(0).getPacksSelected()));
@ -1247,7 +1278,7 @@ public class FirstStepFragment extends Fragment implements View.OnClickListener
+ "\nSampleSizeMinor: " + sampleSizeMinor; + "\nSampleSizeMinor: " + sampleSizeMinor;
txtTesting.setText(testDetails); txtTesting.setText(testDetails);
Log.e("SampleSizeMajor: ",""+sampleSizeMajor); //Log.e("SampleSizeMajor: ",""+sampleSizeMajor);
aqlSampleSize.setText(String.valueOf(sampleSizeMajor)); aqlSampleSize.setText(String.valueOf(sampleSizeMajor));
store.getReport().getItems().get(0).setSampleSize(sampleSizeMajor); store.getReport().getItems().get(0).setSampleSize(sampleSizeMajor);

View File

@ -442,6 +442,33 @@ public class ThirdStepFragment extends Fragment implements View.OnClickListener
} }
} }
/*private void saveReportDirectlyToServer(Store store) {
apiService.saveInspectionReport(store.getReport()).enqueue(new Callback<Map<String, String>>() {
@Override
public void onResponse(Call<Map<String, String>> call, Response<Map<String, String>> 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<Map<String, String>> call, Throwable t) {
progressBar.setVisibility(View.GONE);
Log.e("onFailure-message",""+t.getMessage());
}
}
);
}*/
private void saveReportDialog() { private void saveReportDialog() {
LayoutInflater inflater = LayoutInflater.from(getContext()); LayoutInflater inflater = LayoutInflater.from(getContext());
View dialogView = inflater.inflate(R.layout.save_report_dialog, null); View dialogView = inflater.inflate(R.layout.save_report_dialog, null);

View File

@ -9,6 +9,7 @@ import android.net.NetworkInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.ProgressBar; import android.widget.ProgressBar;
@ -27,8 +28,10 @@ import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.ObjectInputStream;
import java.util.Objects; import java.util.Objects;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -233,4 +236,70 @@ public class FileUtils {
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 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();
}
}
} }

View File

@ -856,4 +856,15 @@
android:text="Add Dimensions" /> android:text="Add Dimensions" />
</RelativeLayout> </RelativeLayout>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>