Refactor dialog choose art form list Arts

This commit is contained in:
Marco Elefante 2025-04-09 15:29:59 +02:00
parent 58521997c1
commit 13b3d5e63b
10 changed files with 188 additions and 117 deletions

View File

@ -132,6 +132,8 @@ import it.integry.integrywmsnative.view.dialogs.basket_lu.DialogBasketLUComponen
import it.integry.integrywmsnative.view.dialogs.basket_lu.DialogBasketLUModule; import it.integry.integrywmsnative.view.dialogs.basket_lu.DialogBasketLUModule;
import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageComponent; import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageComponent;
import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageModule; import it.integry.integrywmsnative.view.dialogs.bind_product_barcode_with_package.DialogBindProductBarcodeWithPackageModule;
import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts.DialogChooseArtFromListaArtsComponent;
import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts.DialogChooseArtFromListaArtsModule;
import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromMtbAartListComponent; import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromMtbAartListComponent;
import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromMtbAartListModule; import it.integry.integrywmsnative.view.dialogs.choose_arts_from_lista_arts.DialogChooseArtsFromMtbAartListModule;
import it.integry.integrywmsnative.view.dialogs.choose_arts_from_mtbcolr_list.DialogChooseArtsFromMtbColrListComponent; import it.integry.integrywmsnative.view.dialogs.choose_arts_from_mtbcolr_list.DialogChooseArtsFromMtbColrListComponent;
@ -248,7 +250,8 @@ import it.integry.integrywmsnative.view.dialogs.update_available.DialogUpdateAva
DialogAskLivelloPosizioneModule.class, DialogAskLivelloPosizioneModule.class,
VerificaGiacenzeModule.class, VerificaGiacenzeModule.class,
DialogExtraInfoModule.class, DialogExtraInfoModule.class,
DialogAskDepositoModule.class DialogAskDepositoModule.class,
DialogChooseArtFromListaArtsModule.class
}) })
public interface MainApplicationComponent { public interface MainApplicationComponent {
@ -417,6 +420,8 @@ public interface MainApplicationComponent {
DialogAskDepositoComponent.Factory dialogAskDepositoComponent(); DialogAskDepositoComponent.Factory dialogAskDepositoComponent();
DialogChooseArtFromListaArtsComponent.Factory dialogChooseArtFromListaArtsComponent();
void inject(MainApplication mainApplication); void inject(MainApplication mainApplication);
void inject(AppContext mainApplication); void inject(AppContext mainApplication);

View File

@ -329,8 +329,8 @@ public class RettificaGiacenzeFragment extends BaseFragment implements ITitledFr
@Override @Override
public void onArtListLoaded(ArrayList<MtbAart> artList, RunnableArgs<MtbAart> onArtChoosed) { public void onArtListLoaded(ArrayList<MtbAart> artList, RunnableArgs<MtbAart> onArtChoosed) {
new DialogChooseArtFromListaArtsView(true, artList, onArtChoosed) DialogChooseArtFromListaArtsView.newInstance(true, artList, onArtChoosed)
.show(requireActivity().getSupportFragmentManager(), "tag"); .show(requireActivity().getSupportFragmentManager(), "dialog-choose-art");
} }
@Override @Override

View File

@ -1173,8 +1173,8 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo
@Override @Override
public void onChooseArtRequest(List<MtbAart> artsList, RunnableArgs<MtbAart> onComplete) { public void onChooseArtRequest(List<MtbAart> artsList, RunnableArgs<MtbAart> onComplete) {
new DialogChooseArtFromListaArtsView(true, artsList, onComplete) DialogChooseArtFromListaArtsView.newInstance(true, artsList, onComplete)
.show(getSupportFragmentManager(), "tag"); .show(getSupportFragmentManager(), "dialog-choose-art");
} }
@Override @Override

View File

@ -367,8 +367,23 @@ public class SpedizioneViewModel {
if (this.mListener != null) mListener.onCreateDocsRequest(); if (this.mListener != null) mListener.onCreateDocsRequest();
} }
private void sendChooseArtRequest(List<MtbAart> mtbAarts, RunnableArgs<MtbAart> onComplete) { private MtbAart sendChooseArtRequest(List<MtbAart> mtbAarts) {
if (this.mListener != null) mListener.onChooseArtRequest(mtbAarts, onComplete); final CountDownLatch latch = new CountDownLatch(1);
AtomicReference<MtbAart> result = new AtomicReference<>();
mListener.onChooseArtRequest(mtbAarts, data -> {
result.set(data);
latch.countDown();
});
try {
latch.await(); // Attende che il dialog venga chiuso
return result.get();
} catch (InterruptedException e) {
this.sendError(e);
}
return null;
} }
private List<MtbAart> sendChooseArtsRequest(List<MtbAart> mtbAarts) { private List<MtbAart> sendChooseArtsRequest(List<MtbAart> mtbAarts) {
@ -755,13 +770,9 @@ public class SpedizioneViewModel {
if (mtbAartList.size() == 1) { if (mtbAartList.size() == 1) {
this.searchArtFromAnag(mtbAartList.get(0), pickData); this.searchArtFromAnag(mtbAartList.get(0), pickData);
} else { } else {
this.sendChooseArtRequest(mtbAartList, art -> { var art = this.sendChooseArtRequest(mtbAartList);
try { if (art == null) return;
this.searchArtFromAnag(art, pickData); this.searchArtFromAnag(art, pickData);
} catch (Exception e) {
this.sendError(e);
}
});
} }
} else { } else {
throw new NoResultFromBarcodeException(barcodeProd); throw new NoResultFromBarcodeException(barcodeProd);

View File

@ -1,77 +0,0 @@
package it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.interfaces.IRecyclerItemClicked;
import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.databinding.DialogChooseArtFromListaArtItemModelBinding;
public class DialogChooseArtFromListaArtsAdapter extends RecyclerView.Adapter<DialogChooseArtFromListaArtsAdapter.ViewHolder> {
protected Context mContext;
private List<MtbAart> mDataset;
private final IRecyclerItemClicked<MtbAart> mOnItemClickListener;
public static class ViewHolder extends RecyclerView.ViewHolder {
protected DialogChooseArtFromListaArtItemModelBinding mViewDataBinding;
public ViewHolder(DialogChooseArtFromListaArtItemModelBinding v) {
super(v.getRoot());
mViewDataBinding = v;
}
public void bind(MtbAart mtbAart) {
mViewDataBinding.setItem(mtbAart);
mViewDataBinding.executePendingBindings();
}
}
public DialogChooseArtFromListaArtsAdapter(Context context, List<MtbAart> myDataset, IRecyclerItemClicked<MtbAart> onItemClickListener) {
mContext = context;
mDataset = myDataset;
mOnItemClickListener = onItemClickListener;
}
@Override
public DialogChooseArtFromListaArtsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
DialogChooseArtFromListaArtItemModelBinding viewDataBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.dialog_choose_art_from_lista_art__item_model, parent, false);
return new ViewHolder(viewDataBinding);
}
@Override
public void onBindViewHolder(DialogChooseArtFromListaArtsAdapter.ViewHolder holder, int position) {
MtbAart item = mDataset.get(position);
holder.bind(item);
holder.mViewDataBinding.getRoot().setOnClickListener(x -> {
if(mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(item, position);
}
});
}
@Override
public void onViewRecycled(DialogChooseArtFromListaArtsAdapter.ViewHolder holder) {
super.onViewRecycled(holder);
}
@Override
public int getItemCount() {
return mDataset.size();
}
}

View File

@ -0,0 +1,14 @@
package it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts;
import dagger.Subcomponent;
@Subcomponent
public interface DialogChooseArtFromListaArtsComponent {
@Subcomponent.Factory
interface Factory {
DialogChooseArtFromListaArtsComponent create();
}
void inject(DialogChooseArtFromListaArtsView dialogChooseArtFromListaArtsView);
}

View File

@ -0,0 +1,14 @@
package it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts;
import dagger.Module;
import dagger.Provides;
@Module(subcomponents = DialogChooseArtFromListaArtsComponent.class)
public class DialogChooseArtFromListaArtsModule {
@Provides
DialogChooseArtFromListaArtsViewModel providesDialogChooseArtFromListaArtsViewModel() {
return new DialogChooseArtFromListaArtsViewModel();
}
}

View File

@ -1,6 +1,8 @@
package it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts; package it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -10,76 +12,116 @@ import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.ravikoradiya.liveadapter.LiveAdapter;
import com.ravikoradiya.liveadapter.Type;
import java.util.List; import java.util.List;
import java.util.Objects;
import javax.inject.Inject;
import it.integry.integrywmsnative.BR;
import it.integry.integrywmsnative.MainApplication;
import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.expansion.BaseDialogFragment; import it.integry.integrywmsnative.core.expansion.BaseDialogFragment;
import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.IRecyclerItemClicked;
import it.integry.integrywmsnative.core.model.MtbAart; import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.databinding.DialogChooseArtFromListaArtBinding; import it.integry.integrywmsnative.databinding.DialogChooseArtFromListaArtItemModelBinding;
import it.integry.integrywmsnative.databinding.DialogChooseArtFromListaArtsBinding;
import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration;
import kotlin.Unit;
public class DialogChooseArtFromListaArtsView extends BaseDialogFragment { public class DialogChooseArtFromListaArtsView extends BaseDialogFragment {
@Inject
DialogChooseArtFromListaArtsViewModel mViewModel;
private DialogChooseArtFromListaArtsBinding mBindings;
private Context mContext;
private final RunnableArgs<MtbAart> onComplete;
private final boolean mEnableSelection; private final boolean mEnableSelection;
private final List<MtbAart> mListaArts; private final List<MtbAart> mListaArts;
private final RunnableArgs<MtbAart> mOnItemChoosed;
//Pass here all external parameters
public static DialogChooseArtFromListaArtsView newInstance(boolean enableSelection, List<MtbAart> listaArts, RunnableArgs<MtbAart> onComplete) {
return new DialogChooseArtFromListaArtsView(enableSelection, listaArts, onComplete);
}
public DialogChooseArtFromListaArtsView(boolean enableSelection, List<MtbAart> listaArts, RunnableArgs<MtbAart> onItemChoosed) { private DialogChooseArtFromListaArtsView(boolean enableSelection, List<MtbAart> listaArts, RunnableArgs<MtbAart> onComplete) {
super(); super();
this.onComplete = onComplete;
this.mEnableSelection = enableSelection; this.mEnableSelection = enableSelection;
this.mListaArts = listaArts; this.mListaArts = listaArts;
this.mOnItemChoosed = onItemChoosed;
MainApplication.appComponent
.dialogChooseArtFromListaArtsComponent()
.create()
.inject(this);
} }
@NonNull @NonNull
@Override @Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
var binding = DialogChooseArtFromListaArtBinding.inflate(LayoutInflater.from(requireContext())); this.mContext = requireContext();
binding.titleText.setText(this.mEnableSelection ? R.string.dialog_choose_art_from_lista_art : mBindings = DialogChooseArtFromListaArtsBinding.inflate(LayoutInflater.from(this.mContext), null, false);
mBindings.setLifecycleOwner(this);
mBindings.titleText.setText(this.mEnableSelection ? R.string.dialog_choose_art_from_lista_art :
R.string.articoli_disponibili); R.string.articoli_disponibili);
initRecyclerView(binding, mListaArts); initRecyclerView(mBindings, mListaArts);
setCancelable(false); setCancelable(true);
var alertDialog = new MaterialAlertDialogBuilder(requireContext()) var alertDialog = new MaterialAlertDialogBuilder(this.mContext)
.setView(binding.getRoot()) .setView(mBindings.getRoot())
.setCancelable(isCancelable()) .setCancelable(isCancelable())
.create(); .create();
alertDialog.setCanceledOnTouchOutside(isCancelable()); alertDialog.setCanceledOnTouchOutside(isCancelable());
alertDialog.setOnShowListener(this); alertDialog.setOnShowListener(this);
alertDialog.setOnDismissListener(this);
return alertDialog; return alertDialog;
} }
private void initRecyclerView(DialogChooseArtFromListaArtBinding binding, List<MtbAart> dataset) { @Override
public void dismiss() {
dismiss(null);
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
dismiss();
}
public void dismiss(MtbAart item) {
if (getDialog() != null) getDialog().dismiss();
onComplete.run(item);
}
private void initRecyclerView(DialogChooseArtFromListaArtsBinding binding, List<MtbAart> dataset) {
binding.itemsList.setNestedScrollingEnabled(false); binding.itemsList.setNestedScrollingEnabled(false);
binding.itemsList.setHasFixedSize(true); binding.itemsList.setHasFixedSize(true);
binding.itemsList.setLayoutManager(new LinearLayoutManager(requireContext())); binding.itemsList.setLayoutManager(new LinearLayoutManager(requireContext()));
SimpleDividerItemDecoration itemDecorator = new SimpleDividerItemDecoration(requireContext(), SimpleDividerItemDecoration.VERTICAL); SimpleDividerItemDecoration itemDecorator = new SimpleDividerItemDecoration(requireContext(), SimpleDividerItemDecoration.VERTICAL);
itemDecorator.setDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.divider)); itemDecorator.setDrawable(Objects.requireNonNull(ContextCompat.getDrawable(requireContext(), R.drawable.divider)));
binding.itemsList.addItemDecoration(itemDecorator); binding.itemsList.addItemDecoration(itemDecorator);
IRecyclerItemClicked<MtbAart> onItemClickListener = (item, position) -> { var itemType = new Type<MtbAart, DialogChooseArtFromListaArtItemModelBinding>(R.layout.dialog_choose_art_from_lista_art__item_model, BR.item);
if (mOnItemChoosed != null) {
mOnItemChoosed.run(item);
}
dismiss(); itemType.onClick(x -> {
}; dismiss(x.getBinding().getItem());
return null;
});
DialogChooseArtFromListaArtsAdapter mCurrentAdapter = new DialogChooseArtFromListaArtsAdapter( new LiveAdapter(dataset, BR.item)
requireContext(), dataset, this.mEnableSelection ? onItemClickListener : null); .map(MtbAart.class, itemType)
binding.itemsList.setAdapter(mCurrentAdapter); .onNoData(noData -> {
// mBindings.emptyView.setVisibility(noData ? View.VISIBLE : View.GONE);
return Unit.INSTANCE;
})
.into(this.mBindings.itemsList);
} }
} }

View File

@ -0,0 +1,5 @@
package it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts;
public class DialogChooseArtFromListaArtsViewModel {
}

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
app:cardCornerRadius="16dp"
app:cardElevation="0dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingHorizontal="16dp"
android:paddingVertical="16dp">
<androidx.appcompat.widget.AppCompatImageView
style="@style/MaterialAlertDialog.Material3.Title.Icon.CenterStacked"
android:layout_width="36dp"
android:layout_height="36dp"
android:src="@drawable/ic_error_white_24dp"
app:tint="?colorPrimary" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title_text"
style="@style/MaterialAlertDialog.Material3.Title.Text.CenterStacked"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginBottom="16dp"
android:text="@string/dialog_choose_art_from_lista_art" />
<androidx.appcompat.widget.SearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:backgroundTint="@android:color/white"
android:hint="@string/search"
app:iconifiedByDefault="false"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/items_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/dialog_choose_art_from_lista_art__item_model"
tools:itemCount="5"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.cardview.widget.CardView>
</layout>