From 52b4e006c2f875a12bb4af0436f6167014258abe Mon Sep 17 00:00:00 2001 From: saif Date: Wed, 22 May 2024 15:14:59 +0500 Subject: [PATCH] - qa feedback implemented --- .../apiservice/RetrofitClient.java | 5 +- .../models/InspectionItemCheckPoint.java | 60 +++--- .../models/InspectionItemDefect.java | 9 + .../models/VoiceOfCustomer.java | 11 ++ .../service/InspectionReportService.java | 21 +- .../qualitychecker/store/Store.java | 4 +- .../ui/activities/HomeActivity.java | 7 +- .../ui/adapter/CheckPointAdapter.java | 88 ++++----- .../ui/adapter/DefectsAdapter.java | 182 ++++++++++++++++++ .../qualitychecker/ui/adapter/VocAdapter.java | 2 +- .../ui/fragments/SecondStepFragment.java | 33 +++- .../ui/fragments/ThirdStepFragment.java | 34 ++++ app/src/main/res/drawable/ic_add.xml | 4 +- app/src/main/res/layout/activity_home.xml | 8 + app/src/main/res/layout/check_point.xml | 64 +++--- app/src/main/res/layout/defect_item.xml | 36 ++++ .../main/res/layout/fragment_third_step.xml | 45 ++++- app/src/main/res/values/colors.xml | 1 + 18 files changed, 497 insertions(+), 117 deletions(-) create mode 100644 app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/DefectsAdapter.java create mode 100644 app/src/main/res/layout/defect_item.xml 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 b8ffcab..e476926 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/apiservice/RetrofitClient.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/apiservice/RetrofitClient.java @@ -3,13 +3,12 @@ package com.utopiaindustries.qualitychecker.apiservice; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import okhttp3.OkHttpClient; 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.16:8080/uind/"; +// private final static String BASE_URL = "https://portal.utopiaindustries.pk/uind/"; + private final static String BASE_URL = "http://192.168.91.16:8080/uind/"; private static Retrofit retrofit; diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionItemCheckPoint.java b/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionItemCheckPoint.java index 5407a4f..58738c9 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionItemCheckPoint.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionItemCheckPoint.java @@ -1,6 +1,7 @@ package com.utopiaindustries.qualitychecker.models; import java.util.Arrays; +import java.util.List; import java.util.UUID; public class InspectionItemCheckPoint { @@ -11,13 +12,12 @@ public class InspectionItemCheckPoint { private boolean checked; private String remarks; // wrapper - private String defectSeverity; - private InspectionItemDefect defect; + private List defectSeverites; + private List defectTitles; + private List quantities; + private List defects; private byte[] file; private String imagePath; - - private String defectTitle; - private UUID uuid; public InspectionItemCheckPoint(){ @@ -72,24 +72,14 @@ public class InspectionItemCheckPoint { this.file = file; } - public String getDefectSeverity() { - return defectSeverity; + + + public List getDefects(){ + return defects; } - public void setDefectSeverity(String defectSeverity) { - this.defectSeverity = defectSeverity; - } - - public void setDefect(InspectionItemDefect defect) { - this.defect = defect; - } - - public String getDefectTitle() { - return defectTitle; - } - - public void setDefectTitle(String defectTitle) { - this.defectTitle = defectTitle; + public void setDefects(List defects) { + this.defects = defects; } public String getImagePath() { @@ -104,6 +94,30 @@ public class InspectionItemCheckPoint { return uuid; } + public List getDefectSeverites() { + return defectSeverites; + } + + public void setDefectSeverites(List defectSeverites) { + this.defectSeverites = defectSeverites; + } + + public List getDefectTitles() { + return defectTitles; + } + + public void setDefectTitles(List defectTitles) { + this.defectTitles = defectTitles; + } + + public List getQuantities() { + return quantities; + } + + public void setQuantities(List quantities) { + this.quantities = quantities; + } + @Override public String toString() { return "InspectionItemCheckPoint{" + @@ -112,11 +126,9 @@ public class InspectionItemCheckPoint { ", title='" + title + '\'' + ", checked=" + checked + ", remarks='" + remarks + '\'' + - ", defectSeverity='" + defectSeverity + '\'' + - ", defect=" + defect + + ", defects=" + defects + ", file=" + Arrays.toString(file) + ", imagePath='" + imagePath + '\'' + - ", defectTitle='" + defectTitle + '\'' + '}'; } diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionItemDefect.java b/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionItemDefect.java index cba5ba0..73a66f6 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionItemDefect.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/models/InspectionItemDefect.java @@ -8,6 +8,7 @@ public class InspectionItemDefect { private long cpId; private String title; private String defectSeverity; + private float quantity; // wrapper private byte[] file; @@ -43,6 +44,14 @@ public class InspectionItemDefect { this.defectSeverity = defectSeverity; } + public float getQuantity() { + return quantity; + } + + public void setQuantity(float quantity) { + this.quantity = quantity; + } + public byte[] getFile() { return file; } diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/models/VoiceOfCustomer.java b/app/src/main/java/com/utopiaindustries/qualitychecker/models/VoiceOfCustomer.java index 5bd4531..cecff4d 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/models/VoiceOfCustomer.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/models/VoiceOfCustomer.java @@ -8,6 +8,7 @@ public class VoiceOfCustomer { private String pcxHealth; private String imageUrl; private String asin; + private String mostCommonReturnReasonBucket; public String getFnsku() { return fnsku; @@ -66,6 +67,13 @@ public class VoiceOfCustomer { this.itemName = itemName; } + public String getMostCommonReturnReasonBucket() { + return mostCommonReturnReasonBucket; + } + + public void setMostCommonReturnReasonBucket(String mostCommonReturnReasonBucket) { + this.mostCommonReturnReasonBucket = mostCommonReturnReasonBucket; + } @Override public String toString() { @@ -75,6 +83,9 @@ public class VoiceOfCustomer { ", itemName='" + itemName + '\'' + ", fnsku='" + fnsku + '\'' + ", pcxHealth='" + pcxHealth + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", asin='" + asin + '\'' + + ", mostCommonReturnReasonBucket='" + mostCommonReturnReasonBucket + '\'' + '}'; } } \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/service/InspectionReportService.java b/app/src/main/java/com/utopiaindustries/qualitychecker/service/InspectionReportService.java index 202ea4e..9ac00c3 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/service/InspectionReportService.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/service/InspectionReportService.java @@ -4,12 +4,14 @@ import androidx.annotation.NonNull; import com.utopiaindustries.qualitychecker.apiservice.ApiService; import com.utopiaindustries.qualitychecker.apiservice.ApiServiceFactory; +import com.utopiaindustries.qualitychecker.models.InspectionDefect; import com.utopiaindustries.qualitychecker.models.InspectionItemCheckPoint; import com.utopiaindustries.qualitychecker.models.InspectionItemDefect; import com.utopiaindustries.qualitychecker.models.InspectionReport; import com.utopiaindustries.qualitychecker.models.SaveReportCallback; import com.utopiaindustries.qualitychecker.store.Store; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -90,10 +92,8 @@ public class InspectionReportService { ! inspectionReport.getItems().get(0).getCheckPoints().isEmpty() ){ // populate defects in cp for( InspectionItemCheckPoint itemCp : inspectionReport.getItems().get(0).getCheckPoints() ){ - InspectionItemDefect defect = new InspectionItemDefect(); - defect.setDefectSeverity(itemCp.getDefectSeverity()); - defect.setTitle( itemCp.getDefectTitle() ); - itemCp.setDefect( defect ); + List defectList = getInspectionItemDefects(itemCp); + itemCp.setDefects( defectList ); } // post object apiService.saveInspectionReport( inspectionReport ).enqueue( @@ -124,4 +124,17 @@ public class InspectionReportService { callback.onFailure( new Exception("Please Fill the required Fields..") ); } } + + @NonNull + private static List getInspectionItemDefects(InspectionItemCheckPoint itemCp) { + List defectList = new ArrayList<>(); + for (int i = 0; i < itemCp.getDefectTitles().size() ; i++ ){ + InspectionItemDefect defect = new InspectionItemDefect(); + defect.setDefectSeverity(itemCp.getDefectSeverites().get( i ) ); + defect.setTitle( itemCp.getDefectTitles().get( i ) ); + defect.setQuantity( itemCp.getQuantities().get( i ) ); + defectList.add( defect ); + } + return defectList; + } } \ No newline at end of file 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 a7fa2ad..17588c2 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/store/Store.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/store/Store.java @@ -102,9 +102,11 @@ public class Store { for( InspectionCheckPoint cp : response.body() ){ InspectionItemCheckPoint icp = new InspectionItemCheckPoint(); icp.setTitle( cp.getTitle() ); - icp.setDefectSeverity("MINOR"); icp.setChecked( false ); icp.setRemarks(""); + icp.setDefectTitles( new ArrayList<>() ); + icp.setDefectSeverites( new ArrayList<>() ); + icp.setQuantities( new ArrayList<>() ); itemCp.add( icp ); } report.getItems().get( 0 ).setCheckPoints( itemCp ); 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 0c110d0..7c8c9ce 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 @@ -42,7 +42,7 @@ public class HomeActivity extends AppCompatActivity implements View.OnClickListe private Button createReportBtn,refreshReportsBtn,logoutBtn; private RecyclerView recyclerView; private ApiService apiService; - private TextView usernameTitle; + private TextView usernameTitle, emptyReportTextView; private ImageView profileImage; private Store store; @@ -71,6 +71,7 @@ public class HomeActivity extends AppCompatActivity implements View.OnClickListe recyclerView = findViewById( R.id.reports_recyclerview ); usernameTitle = findViewById( R.id.username_title ); profileImage = findViewById( R.id.profile_image ); + emptyReportTextView = findViewById( R.id.empty_report_text ); refreshReportsBtn.setOnClickListener( this ); createReportBtn.setOnClickListener( this ); @@ -93,13 +94,17 @@ public class HomeActivity extends AppCompatActivity implements View.OnClickListe System.out.println( response.body() ); ReportAdapter adapter = new ReportAdapter( response.body() ); recyclerView.setAdapter( adapter ); + if( response.body().isEmpty() ) + emptyReportTextView.setVisibility( View.VISIBLE ) ; } else { System.out.println("Error"); + emptyReportTextView.setVisibility( View.VISIBLE ) ; } } @Override public void onFailure(Call> call, Throwable t) { System.out.println( t.getMessage() ); + emptyReportTextView.setVisibility( View.VISIBLE ) ; } } ); diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/CheckPointAdapter.java b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/CheckPointAdapter.java index 928f575..cfe3751 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/CheckPointAdapter.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/CheckPointAdapter.java @@ -21,6 +21,7 @@ import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.utopiaindustries.qualitychecker.R; @@ -29,7 +30,6 @@ import com.utopiaindustries.qualitychecker.models.InspectionDefect; import com.utopiaindustries.qualitychecker.models.InspectionItemCheckPoint; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; public class CheckPointAdapter extends @@ -69,7 +69,7 @@ public class CheckPointAdapter extends @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { InspectionItemCheckPoint checkPoint = checkPointList.get( position ); - holder.bind(checkPoints, defects, defectTypes, checkPoint); + holder.bind(checkPoints, defects, defectTypes, checkPoint, context ); holder.setIsRecyclable(false); // spinner on change { @@ -87,28 +87,6 @@ public class CheckPointAdapter extends } }); - holder.defectsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - String selectedItem = parent.getItemAtPosition(position).toString(); - checkPoint.setDefectTitle(selectedItem); - } - @Override - public void onNothingSelected(AdapterView parent) { - } - }); - - holder.defectTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - String selectedItem = parent.getItemAtPosition(position).toString(); - checkPoint.setDefectSeverity(selectedItem); - } - @Override - public void onNothingSelected(AdapterView parent) { - - } - }); } // checkboxes on change { @@ -146,6 +124,13 @@ public class CheckPointAdapter extends holder.imagePreview.setImageDrawable( null ); notifyItemChanged( position ); }); + + holder.addDefect.setOnClickListener( v -> { + checkPoint.getDefectTitles().add(""); + checkPoint.getDefectSeverites().add("MINOR"); + checkPoint.getQuantities().add(0f); + notifyItemChanged( position ); + }); } @@ -155,15 +140,17 @@ public class CheckPointAdapter extends } public static class ViewHolder extends RecyclerView.ViewHolder { - private final Spinner checkpointSpinner, defectsSpinner, defectTypeSpinner; + private final Spinner checkpointSpinner; +// private final Spinner defectsSpinner, defectTypeSpinner; private final CheckBox okCheckBox, noCheckBox; private final EditText remarks; - private final ImageButton imagePicker,deleteImage; + private final ImageButton imagePicker,deleteImage,addDefect; private final LinearLayout linearLayout; private final TextView selectedImage; private final ImageView imagePreview; + private final RecyclerView defectRecyclerView; - public ViewHolder( @NonNull View itemView) { + public ViewHolder(@NonNull View itemView ) { super(itemView); remarks = itemView.findViewById(R.id.check_point_remarks); checkpointSpinner = itemView.findViewById(R.id.check_point_spinner); @@ -171,16 +158,24 @@ public class CheckPointAdapter extends noCheckBox = itemView.findViewById(R.id.check_point_no); imagePicker = itemView.findViewById(R.id.image_picker ); selectedImage = itemView.findViewById( R.id.selected_image ); - defectsSpinner = itemView.findViewById(R.id.defect_spinner); - defectTypeSpinner = itemView.findViewById(R.id.defect_type_spinner); +// defectsSpinner = itemView.findViewById(R.id.defect_spinner); +// defectTypeSpinner = itemView.findViewById(R.id.defect_type_spinner); linearLayout = itemView.findViewById(R.id.defect_layout); deleteImage = itemView.findViewById( R.id.delete_image ); imagePreview = itemView.findViewById( R.id.preview_image ); + defectRecyclerView = itemView.findViewById( R.id.defects_recyclerview ); + addDefect = itemView.findViewById( R.id.add_defect ); } + + public void bind(List checkPoints, List defects, List defectTypeOptions, - InspectionItemCheckPoint data ) { + InspectionItemCheckPoint data, + Context context ) { + // initialize recyclerview + + List checkPointsList = checkPoints.stream().map(InspectionCheckPoint::getTitle).collect(Collectors.toList()); // Populate checklist Spinner dropdown @@ -189,21 +184,12 @@ public class CheckPointAdapter extends spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); checkpointSpinner.setAdapter(spinnerAdapter); - // Populate defect type Spinner dropdown - ArrayAdapter defectTypeSpinnerAdapter = new ArrayAdapter<>(defectTypeSpinner.getContext(), - android.R.layout.simple_spinner_item, defectTypeOptions); - defectTypeSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - defectTypeSpinner.setAdapter(defectTypeSpinnerAdapter); // Pre populate String defaultSelectedItem = data.getTitle(); int defaultPosition = checkPointsList.indexOf(defaultSelectedItem); checkpointSpinner.setSelection(defaultPosition); - String defaultSelectedDefectType = data.getDefectSeverity(); - int defaultSelectedDefectTypePosition = defectTypeOptions.indexOf(defaultSelectedDefectType); - defectTypeSpinner.setSelection(defaultSelectedDefectTypePosition); - remarks.setText( data.getRemarks() ); okCheckBox.setChecked( data.getChecked() ); noCheckBox.setChecked( ! data.getChecked()); @@ -219,6 +205,13 @@ public class CheckPointAdapter extends Bitmap bitmap = BitmapFactory.decodeByteArray( data.getFile(), 0 , data.getFile().length ); imagePreview.setImageBitmap( bitmap ); } + + InspectionCheckPoint cp = checkPoints.stream().filter(c ->c.getTitle().equalsIgnoreCase(defaultSelectedItem)).findFirst().get(); + + defectRecyclerView.setLayoutManager( new LinearLayoutManager( context ) ); + DefectsAdapter defectsAdapter = new DefectsAdapter(data, defectTypeOptions, defects, cp); + defectRecyclerView.setAdapter( defectsAdapter ); + } private void populateDefects(InspectionCheckPoint cp, List defects, InspectionItemCheckPoint data) { @@ -226,15 +219,16 @@ public class CheckPointAdapter extends .filter(d -> d.getCategory().equalsIgnoreCase(cp.getCategory())) .collect(Collectors.toList()); List defectList = filteredDefects.stream().map(InspectionDefect::getDefect).collect(Collectors.toList()); - // Populate defect Spinner dropdown - ArrayAdapter defectSpinnerAdapter = new ArrayAdapter<>(defectsSpinner.getContext(), - android.R.layout.simple_spinner_item, defectList); - defectSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - defectsSpinner.setAdapter(defectSpinnerAdapter); - String defaultDefectSelectedItem = data.getDefectTitle(); - int defaultSelectedDefectPosition = defectList.indexOf(defaultDefectSelectedItem); - defectsSpinner.setSelection(defaultSelectedDefectPosition); + // Populate defect Spinner dropdown +// ArrayAdapter defectSpinnerAdapter = new ArrayAdapter<>(defectsSpinner.getContext(), +// android.R.layout.simple_spinner_item, defectList); +// defectSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); +// defectsSpinner.setAdapter(defectSpinnerAdapter); +// +// String defaultDefectSelectedItem = data.getDefectTitle(); +// int defaultSelectedDefectPosition = defectList.indexOf(defaultDefectSelectedItem); +// defectsSpinner.setSelection(defaultSelectedDefectPosition); } public void setupRemarksListener(InspectionItemCheckPoint checkPoint) { diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/DefectsAdapter.java b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/DefectsAdapter.java new file mode 100644 index 0000000..291c632 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/DefectsAdapter.java @@ -0,0 +1,182 @@ +package com.utopiaindustries.qualitychecker.ui.adapter; + +import android.text.Editable; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.Spinner; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.utopiaindustries.qualitychecker.R; +import com.utopiaindustries.qualitychecker.models.InspectionCheckPoint; +import com.utopiaindustries.qualitychecker.models.InspectionDefect; +import com.utopiaindustries.qualitychecker.models.InspectionItemCheckPoint; + +import java.util.List; +import java.util.stream.Collectors; + +public class DefectsAdapter extends RecyclerView.Adapter { + + private InspectionItemCheckPoint checkPoint; + private List defectTypes; + private List defects; + + private InspectionCheckPoint cp ; + + public DefectsAdapter(InspectionItemCheckPoint checkPoint, + List defectTypes, + List defects, InspectionCheckPoint cp) { + this.checkPoint = checkPoint; + this.defectTypes = defectTypes; + this.defects = defects; + this.cp = cp; + } + + @NonNull + @Override + public DefectViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from( parent.getContext() ) + .inflate(R.layout.defect_item, parent, false); + return new DefectViewHolder(view); + } + + + private void populateDefectSeveritySpinner( DefectViewHolder holder ){ + String defectType = checkPoint.getDefectSeverites().get( holder.getAdapterPosition() ); + ArrayAdapter defectTypeSpinnerAdapter = new ArrayAdapter<>( holder.defectTypeSpinner.getContext(), + android.R.layout.simple_spinner_item, defectTypes ); + defectTypeSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + holder.defectTypeSpinner.setAdapter(defectTypeSpinnerAdapter); + + String defaultSelectedDefectType = defectType; + int defaultSelectedDefectTypePosition = defectTypes.indexOf(defaultSelectedDefectType); + holder.defectTypeSpinner.setSelection(defaultSelectedDefectTypePosition); + } + + private void populateDefectOptionsSpinner( DefectViewHolder holder ){ + String defect = checkPoint.getDefectTitles().get( holder.getAdapterPosition() ); + + List filteredDefects = defects.stream() + .filter(d -> d.getCategory().equalsIgnoreCase(cp.getCategory())) + .collect(Collectors.toList()); + List defectList = filteredDefects.stream().map(InspectionDefect::getDefect).collect(Collectors.toList()); + + ArrayAdapter defectSpinnerAdapter = new ArrayAdapter<>( holder.defectSpinner.getContext(), + android.R.layout.simple_spinner_item, defectList ); + defectSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + holder.defectSpinner.setAdapter(defectSpinnerAdapter); + + String defaultSelectedDefect = defect; + int defaultSelectedDefectPosition = defectList.indexOf(defaultSelectedDefect); + holder.defectSpinner.setSelection(defaultSelectedDefectPosition); + } + + private void populateQuantity( DefectViewHolder holder ){ + + Float quantity = checkPoint.getQuantities().get( holder.getAdapterPosition() ); + if( quantity != null ){ + holder.quantity.setText( String.valueOf( quantity ) ); + } else { + holder.quantity.setText( String.valueOf( 0f ) ); + } + } + + @Override + public void onBindViewHolder(@NonNull DefectViewHolder holder, int position) { + + populateDefectSeveritySpinner( holder ); + populateDefectOptionsSpinner( holder ); + populateQuantity( holder ); + // Populate defect type Spinner dropdown + + { + holder.defectTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + String selectedItem = parent.getItemAtPosition(position).toString(); + checkPoint.getDefectSeverites().set( holder.getAdapterPosition(), selectedItem) ; + } + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + holder.defectSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + String selectedItem = parent.getItemAtPosition(position).toString(); + checkPoint.getDefectTitles().set( holder.getAdapterPosition(), selectedItem) ; + } + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + holder.quantity.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if( s == null || s.toString().isEmpty() ){ + checkPoint.getQuantities().set( position , 0F ); + + } else { + checkPoint.getQuantities().set( position , Float.parseFloat( s.toString() )); + + } + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + holder.deleteBtn.setOnClickListener(v-> { + System.out.println( holder.getAdapterPosition() ); + removeItem( holder.getAdapterPosition() ); + }); + } + } + public void removeItem(int position) { + if( position >= 0 && position < checkPoint.getDefectSeverites().size() ){ + checkPoint.getDefectSeverites().remove( position ) ; + checkPoint.getDefectTitles().remove( position ) ; + checkPoint.getQuantities().remove( position ); + notifyItemRemoved( position ); + + } + } + + + @Override + public int getItemCount() { + return Math.max( checkPoint.getDefectTitles().size(), checkPoint.getDefectTitles().size() ); + } + + public static class DefectViewHolder extends RecyclerView.ViewHolder{ + + private Spinner defectSpinner, defectTypeSpinner; + private ImageButton deleteBtn; + private EditText quantity; + + public DefectViewHolder(@NonNull View itemView) { + super(itemView); + defectSpinner = itemView.findViewById( R.id.defect_spinner ); + defectTypeSpinner = itemView.findViewById( R.id.defect_type_spinner ); + deleteBtn = itemView.findViewById( R.id.delete_defect ); + quantity = itemView.findViewById( R.id.defect_quantity ); + } + + } +} diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/VocAdapter.java b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/VocAdapter.java index 4402837..26d0d23 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/VocAdapter.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/adapter/VocAdapter.java @@ -68,7 +68,7 @@ public class VocAdapter extends asin.setText( voc.getAsin() ); fnsku.setText( voc.getFnsku() ); health.setText( voc.getPcxHealth() ); - item .setText( voc.getItemName() ); + item .setText( voc.getMostCommonReturnReasonBucket() ); markeplace.setText( voc.getMarketplace() ); Glide.with( context ) .load( voc.getImageUrl() ) diff --git a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/SecondStepFragment.java b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/SecondStepFragment.java index 7aabb77..ca8c13a 100644 --- a/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/SecondStepFragment.java +++ b/app/src/main/java/com/utopiaindustries/qualitychecker/ui/fragments/SecondStepFragment.java @@ -6,8 +6,11 @@ import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; +import android.util.Base64; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -93,7 +96,7 @@ public class SecondStepFragment extends Fragment if (ContextCompat.checkSelfPermission( getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(getActivity(), + ActivityCompat.requestPermissions( getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); } @@ -134,7 +137,9 @@ public class SecondStepFragment extends Fragment assert selectedImageUri != null; String imagePath = selectedImageUri.getPath(); store.getReport().getItems().get( 0 ).getCheckPoints().get( requestCode ).setImagePath( imagePath ); - store.getReport().getItems().get( 0 ).getCheckPoints().get( requestCode ).setFile( getBytesFromUri( getContext(), selectedImageUri ) ); + store.getReport().getItems().get( 0 ).getCheckPoints().get( requestCode ).setFile( + compressImageToMaxSize( getBytesFromUri( getContext(), selectedImageUri ), 200 ) + ); adapter.notifyItemChanged( requestCode ); } catch (Exception e) { throw new RuntimeException(e); @@ -163,4 +168,28 @@ public class SecondStepFragment extends Fragment } return null; } + + public byte[] compressImageToMaxSize(byte[] imageData, + int maxSizeKB) { + int quality = 100; // Start with highest quality + byte[] compressedBytes = compressImage(imageData, quality); + // Loop to reduce quality until the image is within the max size + while (compressedBytes.length > maxSizeKB * 1024 && quality > 0) { + quality -= 5; + compressedBytes = compressImage(imageData, quality); + } + + return compressedBytes; + } + + private byte[] compressImage(byte[] imageData, + int quality) { + if( imageData != null && imageData.length > 0 ) { + Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); + return outputStream.toByteArray(); + } + return null; + } } 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 6546a83..ee7125b 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 @@ -1,5 +1,6 @@ package com.utopiaindustries.qualitychecker.ui.fragments; +import android.annotation.SuppressLint; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; @@ -30,7 +31,10 @@ import com.bumptech.glide.Glide; import com.utopiaindustries.qualitychecker.R; import com.utopiaindustries.qualitychecker.apiservice.ApiService; import com.utopiaindustries.qualitychecker.apiservice.ApiServiceFactory; +import com.utopiaindustries.qualitychecker.models.InspectionItemCheckPoint; +import com.utopiaindustries.qualitychecker.models.InspectionItemDefect; import com.utopiaindustries.qualitychecker.models.InspectionItemDimension; +import com.utopiaindustries.qualitychecker.models.InspectionReport; import com.utopiaindustries.qualitychecker.models.SaveReportCallback; import com.utopiaindustries.qualitychecker.models.VoiceOfCustomer; import com.utopiaindustries.qualitychecker.service.InspectionReportService; @@ -61,6 +65,8 @@ public class ThirdStepFragment extends Fragment implements View.OnClickListener private ApiService apiService; private EditText generalRemarks; + private TextView minorCountTv,majorCountTv,criticalCountTv; + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -215,6 +221,7 @@ public class ThirdStepFragment extends Fragment implements View.OnClickListener } + @SuppressLint("DefaultLocale") private void populateViews(){ profileName.setText( store.getEmployeePhoto().getName() ); @@ -245,6 +252,30 @@ public class ThirdStepFragment extends Fragment implements View.OnClickListener } }); + + minorCountTv.setText( String.valueOf(0) ); + majorCountTv.setText( String.valueOf(0) ) ; + criticalCountTv.setText( String.valueOf(0) ); + + InspectionReport inspectionReport = store.getReport(); + if( Objects.nonNull( inspectionReport ) && inspectionReport.getItems() != null && + ! inspectionReport.getItems().isEmpty() && + ! inspectionReport.getItems().get(0).getCheckPoints().isEmpty() ) { + int minor = 0; + int major = 0; + int crirical = 0; + for (InspectionItemCheckPoint itemCp : inspectionReport.getItems().get(0).getCheckPoints()) { + for( String status : itemCp.getDefectSeverites() ){ + if( status.equalsIgnoreCase("minor") ) minor++; + if( status.equalsIgnoreCase("major") ) major++; + if( status.equalsIgnoreCase("critical") ) crirical++; + } + } + + minorCountTv.setText( String.format("Minor : %d", minor ) ); + majorCountTv.setText( String.format("Major : %d", major ) ) ; + criticalCountTv.setText( String.format("Critical : %d", crirical ) ); + } } private void calculateDimensions(){ @@ -309,6 +340,9 @@ public class ThirdStepFragment extends Fragment implements View.OnClickListener resultSpinner = view.findViewById( R.id.result_spinner ); generalRemarks = view.findViewById( R.id.general_remarks ); itemDimensionsRecyclerView = view.findViewById( R.id.item_dimensions_recyclerview ); + minorCountTv = view.findViewById( R.id.minor_count ); + majorCountTv = view.findViewById( R.id.major_count ); + criticalCountTv = view.findViewById( R.id.critical_count ); } private void setOnClickListeners(){ nextBtn.setOnClickListener( this ); diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml index 2ae27b8..62eb4b0 100644 --- a/app/src/main/res/drawable/ic_add.xml +++ b/app/src/main/res/drawable/ic_add.xml @@ -1,5 +1,5 @@ - + - + diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 4b3ab79..6682206 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -92,6 +92,14 @@ android:padding="16dp"> + + diff --git a/app/src/main/res/layout/check_point.xml b/app/src/main/res/layout/check_point.xml index d49e47a..1deebe7 100644 --- a/app/src/main/res/layout/check_point.xml +++ b/app/src/main/res/layout/check_point.xml @@ -1,10 +1,13 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/defect_item.xml b/app/src/main/res/layout/defect_item.xml new file mode 100644 index 0000000..2fd8a36 --- /dev/null +++ b/app/src/main/res/layout/defect_item.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_third_step.xml b/app/src/main/res/layout/fragment_third_step.xml index c765fdb..2fe4e45 100644 --- a/app/src/main/res/layout/fragment_third_step.xml +++ b/app/src/main/res/layout/fragment_third_step.xml @@ -323,15 +323,44 @@ android:text="Status" android:textColor="@color/black" android:textStyle="bold" - android:layout_marginBottom="5dp" - /> - - + + android:layout_height="wrap_content"> + + + + + #20830E #FF0000 #29DAF1 + #FFFFFF \ No newline at end of file